

使用RFC跳过权限校验的方法 - 斌将军
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.

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通讯类型可能更加适合。
定期更文,欢迎关注

Recommend
-
81
solidot新版网站常见问题,请点击这里查看。 提交文章 ...
-
38
点击上方“ BAT的乌托邦 ”,选择“ 设为星标 ” ...
-
12
入参空值校验的原因与方法 2020-06-10 7 min read
-
4
有偿:Android 跳过厂家权限后台弹出界面File failed to load: https://static.oschina.net/new-osc/js/utils/plugins/mathjax2.7.4/extensions/a11y/accessibility-menu.js
-
9
微信版本 <= 8.0.18开启 X5 内核:debugmm.qq.com/?forcex5=true复制这个在微信团队后点开或用微信扫描二维码
-
2
此文章属于ruoyi项目实战系列 ruoyi系统在前端主要通过权限字符包含与否来动态显示目录和按钮。为了防止通过http请求绕过权限限制,后端接口也需要进行相关权限设计。
-
5
优维低代码:Permissions 权限校验 EASYOPS_youwei · 大约2小时之...
-
6
V2EX › 分享发现 注册 Google 跳过手机的方法 acei...
-
4
在 Mac M1 下使用 VMware Fusion 安装 Windows 11 跳过网络 Posted on 10/10/2023 , Last...
-
5
一日一技:分布式系统的低成本权限校验机制 2023-11-29 86 1.2k 4 分钟 经常关注未闻Code的同学都知道,我做了一个叫做
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK