7

使用RFC跳过权限校验的方法 - 斌将军

 1 year ago
source link: https://www.cnblogs.com/BinGeneral/p/17928332.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1、业务背景

由于业务流程的复杂性,用户往往只具备部分功能的权限,导致在操作自开发程序时出现权限问题。例如前台限制了用户对销售订单的修改,而自开发功能中又涉及单据修改,此时一味限制权限,则无法正常使用功能。

2、使用RFC跳过权限

2.1、实现原理

将被权限限制的逻辑,封装成RFC函数,在调用时,使用拥有大权限的账号,远程调用目标系统(实际还是本系统)的RFC,则实际上在代码运行时,是使用了大权限的账号,执行了该函数。最终在凭证中的更改日志,也是记录了大权限账号的修改记录。

2.2、封装RFC

例如将销售订单修改逻辑封装到RFC中

复制BAPI_SALESORDER_CHANGE到ZBAPI_SALESORDER_CHANGE,确保远程模式

1225252-20231226154455149-1893775526.png

原参数保持不变,多增加一个返回结构E_RESULT,将调用BAPI的最终结果处理后返回,这样外部调用时,可以避免重复编写处理BAPI消息的代码

将commit和rollback写在函数中,待凭证处理完之后,执行事务,防止事务一直未提交,出现锁单情况

"--------------------@斌将军--------------------
FUNCTION zbapi_salesorder_change.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(SALESDOCUMENT) LIKE  BAPIVBELN-VBELN
*"     VALUE(ORDER_HEADER_IN) LIKE  BAPISDH1 STRUCTURE  BAPISDH1
*"       OPTIONAL
*"     VALUE(ORDER_HEADER_INX) LIKE  BAPISDH1X STRUCTURE  BAPISDH1X
*"     VALUE(SIMULATION) LIKE  BAPIFLAG-BAPIFLAG OPTIONAL
*"     VALUE(BEHAVE_WHEN_ERROR) LIKE  BAPIFLAG-BAPIFLAG DEFAULT SPACE
*"     VALUE(INT_NUMBER_ASSIGNMENT) LIKE  BAPIFLAG-BAPIFLAG DEFAULT
*"       SPACE
*"     VALUE(LOGIC_SWITCH) LIKE  BAPISDLS STRUCTURE  BAPISDLS OPTIONAL
*"     VALUE(NO_STATUS_BUF_INIT) LIKE  BAPIFLAG-BAPIFLAG DEFAULT SPACE
*"  EXPORTING
*"     VALUE(E_RESULT) TYPE  BAPIRETURN
*"  TABLES
*"      RETURN STRUCTURE  BAPIRET2
*"      ORDER_ITEM_IN STRUCTURE  BAPISDITM OPTIONAL
*"      ORDER_ITEM_INX STRUCTURE  BAPISDITMX OPTIONAL
*"      PARTNERS STRUCTURE  BAPIPARNR OPTIONAL
*"      PARTNERCHANGES STRUCTURE  BAPIPARNRC OPTIONAL
*"      PARTNERADDRESSES STRUCTURE  BAPIADDR1 OPTIONAL
*"      ORDER_CFGS_REF STRUCTURE  BAPICUCFG OPTIONAL
*"      ORDER_CFGS_INST STRUCTURE  BAPICUINS OPTIONAL
*"      ORDER_CFGS_PART_OF STRUCTURE  BAPICUPRT OPTIONAL
*"      ORDER_CFGS_VALUE STRUCTURE  BAPICUVAL OPTIONAL
*"      ORDER_CFGS_BLOB STRUCTURE  BAPICUBLB OPTIONAL
*"      ORDER_CFGS_VK STRUCTURE  BAPICUVK OPTIONAL
*"      ORDER_CFGS_REFINST STRUCTURE  BAPICUREF OPTIONAL
*"      SCHEDULE_LINES STRUCTURE  BAPISCHDL OPTIONAL
*"      SCHEDULE_LINESX STRUCTURE  BAPISCHDLX OPTIONAL
*"      ORDER_TEXT STRUCTURE  BAPISDTEXT OPTIONAL
*"      ORDER_KEYS STRUCTURE  BAPISDKEY OPTIONAL
*"      CONDITIONS_IN STRUCTURE  BAPICOND OPTIONAL
*"      CONDITIONS_INX STRUCTURE  BAPICONDX OPTIONAL
*"      EXTENSIONIN STRUCTURE  BAPIPAREX OPTIONAL
*"      EXTENSIONEX STRUCTURE  BAPIPAREX OPTIONAL
*"----------------------------------------------------------------------

  DATA:lv_check   TYPE char1,
       lv_message TYPE char255.

  "修改销售订单
  CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
    EXPORTING
      salesdocument    = salesdocument
*     order_header_in  = order_header_in
      order_header_inx = order_header_inx
      logic_switch     = logic_switch
    TABLES
      return           = return
      order_item_in    = order_item_in
      order_item_inx   = order_item_inx
      schedule_lines   = schedule_lines
      schedule_linesx  = schedule_linesx
      extensionin      = extensionin.

  CLEAR:lv_check,lv_message,e_result.
  LOOP AT return INTO DATA(ls_return) WHERE type CA 'AEX'.
    lv_message = lv_message && ls_return-message.
    lv_check = 'E'.
    CLEAR:ls_return.
  ENDLOOP.

  IF lv_check = 'E'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    e_result-type = 'E'.
    e_result-message = lv_message.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.

    e_result-type = 'S'.
    e_result-message = '修改成功'.
  ENDIF.

ENDFUNCTION.
"--------------------@斌将军--------------------

2.3、配置目标系统

创建ABAP连接

1225252-20231226152203201-1335427597.png
1225252-20231226152501767-1600703408.png

 拥有大权限的账密

1225252-20231226152623166-570415623.png

 Unicode

1225252-20231226152659956-2098566091.png

连接测试成功。点击远程登录,则能直接用配置的账号登录SAPGUI

1225252-20231226152859277-872877895.png

2.4、调用RFC

"--------------------@斌将军--------------------
DATA:gv_system          TYPE rfcdes-rfcdest.
"目标系统
gv_system = sy-sysid && '_' && sy-mandt."S4D_300

"修改销售订单
PERFORM frm_salesorder_change.
IF ls_result-type = 'E'.
      "失败
ELSE.
      "成功 
ENDIF.

FORM frm_salesorder_change.
  "修改销售订单
  CALL FUNCTION 'ZBAPI_SALESORDER_CHANGE' DESTINATION gv_system
    EXPORTING
      salesdocument    = lv_salesdocument
*     order_header_in  = ls_order_header_in
      order_header_inx = ls_order_header_inx
      logic_switch     = ls_logic_switch
    IMPORTING
      e_result         = ls_result
    TABLES
      return           = lt_so_return
      order_item_in    = lt_order_item_in
      order_item_inx   = lt_order_item_inx
      schedule_lines   = lt_schedule_lines
      schedule_linesx  = lt_schedule_linesx
      extensionin      = lt_extensionin.
ENDFORM.
"--------------------@斌将军-------------------

2.5、关于通讯类型Unicode

1225252-20231226154903536-947615801.png

Unicode:表示目标系统能够处理Unicode字符集。Unicode是一种全球通用的字符编码标准,用于表示世界上几乎所有语言的字符。使用Unicode通讯类型,可以在SAP系统中处理并传输多种语言的数据,包括特殊字符和非拉丁字母字符。

非Unicode:表示目标系统只能处理非Unicode字符集。即系统仅支持传输和处理特定的字符集,如ANSI和ASCII字符集。非Unicode通讯类型适用于处理少数语言或特定的本地化需求。

区别:在于系统对字符集的支持和处理能力。Unicode通讯类型允许SAP系统处理更广泛的字符集,使其具有更好的国际化和本地化能力。而非Unicode通讯类型的系统则限制了字符集的范围,可能导致在处理和传输多语言数据时出现问题。在选择目标系统的通讯类型时,需要根据具体的业务需求和语言环境来考虑。如果需要处理多语言数据或具有全球化的需求,建议选择Unicode通讯类型。而如果业务仅涉及特定的语言或本地化需求,非Unicode通讯类型可能更加适合。

定期更文,欢迎关注

1225252-20221117104655486-626157382.jpg

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK