写点什么

使用 RFC 跳过权限校验的方法

  • 2023-12-29
    福建
  • 本文字数:2816 字

    阅读完需:约 9 分钟

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 通讯类型可能更加适合。


文章转载自:斌将军

原文链接:https://www.cnblogs.com/BinGeneral/p/17928332.html

体验地址:http://www.jnpfsoft.com/?from=001

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
使用RFC跳过权限校验的方法_用户_不在线第一只蜗牛_InfoQ写作社区
vConsole