使用RFC跳過許可權校驗的方法

斌將軍發表於2023-12-28

1、業務背景

由於業務流程的複雜性,使用者往往只具備部分功能的許可權,導致在操作自開發程式時出現許可權問題。例如前臺限制了使用者對銷售訂單的修改,而自開發功能中又涉及單據修改,此時一味限制許可權,則無法正常使用功能。

2、使用RFC跳過許可權

2.1、實現原理

將被許可權限制的邏輯,封裝成RFC函式,在呼叫時,使用擁有大許可權的賬號,遠端呼叫目標系統(實際還是本系統)的RFC,則實際上在程式碼執行時,是使用了大許可權的賬號,執行了該函式。最終在憑證中的更改日誌,也是記錄了大許可權賬號的修改記錄。

2.2、封裝RFC

例如將銷售訂單修改邏輯封裝到RFC中

複製BAPI_SALESORDER_CHANGE到ZBAPI_SALESORDER_CHANGE,確保遠端模式

原引數保持不變,多增加一個返回結構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連線

 目標系統

 擁有大許可權的賬密

 Unicode

連線測試成功。點選遠端登入,則能直接用配置的賬號登入SAPGUI

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

Unicode:表示目標系統能夠處理Unicode字符集。Unicode是一種全球通用的字元編碼標準,用於表示世界上幾乎所有語言的字元。使用Unicode通訊型別,可以在SAP系統中處理並傳輸多種語言的資料,包括特殊字元和非拉丁字母字元。

非Unicode:表示目標系統只能處理非Unicode字符集。即系統僅支援傳輸和處理特定的字符集,如ANSI和ASCII字符集。非Unicode通訊型別適用於處理少數語言或特定的本地化需求。

區別:在於系統對字符集的支援和處理能力。Unicode通訊型別允許SAP系統處理更廣泛的字符集,使其具有更好的國際化和本地化能力。而非Unicode通訊型別的系統則限制了字符集的範圍,可能導致在處理和傳輸多語言資料時出現問題。在選擇目標系統的通訊型別時,需要根據具體的業務需求和語言環境來考慮。如果需要處理多語言資料或具有全球化的需求,建議選擇Unicode通訊型別。而如果業務僅涉及特定的語言或本地化需求,非Unicode通訊型別可能更加適合。

 

定期更文,歡迎關注

 

相關文章