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

1、业务背景

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

2、使用RFC跳过权限

2.1、实现原理

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

2.2、封装RFC

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

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

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

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

vbnet 复制代码
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

ini 复制代码
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通讯类型可能更加适合。

文章转载自: 斌将军

原文链接: www.cnblogs.com/BinGeneral/...

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

相关推荐
小江的记录本20 分钟前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi25 分钟前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dFObBIMmai1 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw01 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python
一切皆是因缘际会1 小时前
AI数字分身的底层原理:破解意识、自我与人格复刻的核心难题
大数据·人工智能·ai·架构
前端摸鱼匠1 小时前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
czlczl200209251 小时前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询
数据库·mysql
REDcker2 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
ACP广源盛139246256732 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑
Elastic 中国社区官方博客2 小时前
ES|QL METRICS_INFO 和 TS_INFO:为你的时间序列数据建立目录
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索