点击蓝字 关注我们
一
问题描述
最近帮助同事解决了一个貌似很神奇的问题:
同事增强公司代码搜索帮助,希望只能搜索出给用户授权的公司代码.
使用了授权对象F_BKPF_BUK
FB03的搜索帮助通过了测试.
但是同样的代码, 同样的用户在事务代码AS03的搜索帮助中测试却失败了.
针对用户没有的公司代码, 授权检查语句 AUTHORITY-CHECK 语句也返回了0. 导致测试失败.
AS03中的公司代码搜索帮助 SH_T093C
在搜索帮助中添加增强函数
Z_BUKRS_F4IF_SHLP_EXIT
在增强中执行授权检查语句 无效(没有授权的公司代码也会通过检查).
二
问题分析
实际跟踪时,确实发现 AUTHORITY-CHECK 语句返回值是 0. 看起来像是没有授权的公司代码,授权检查也通过了.
根据原有的常识,觉得这简直不可思议. 于是猜测系统是否有什么机制会抑制授权检查.
于是又仔细读了一下AUTHORITY-CHECK 语句的帮助(图一)
帮助中对返回码SY-SUBRC=0的说明 : 授权检查成功或者没有执行检查.
于是又仔细阅读发现系统中有个 check indicator 设置. 是针对事务代码设置的.
接着阅读check indicator的帮助(图二). 原来是通过SU22/SU24 设置.
于是恍然大悟, 之前常常使用SU22查找事务代码对应的授权对象,但是没有仔细理解SU22中维护的授权对象的目的.原来该设置还会抑制事务代码中授权检查语句的结果.这个抑制效果无法通过ABAP跟踪出,因为它作用在AUTHORITY-CHECK语句的底层逻辑中. 只能通过帮助文档发现.
图一
图二
三
问题解决
尝试在SU22中针对事务代码AS03找到指定的授权对象F_BKPF_BUK,设置检查标识. 测试还是不管用.
尝试在SU24中针对事务代码 AS03找到指定的授权对象F_BKPF_BUK, 设置检查标记. 测试通过.
帮助文档中说明SU22 是模板, SU24是客户系统实际生效的授权检查配置. SU25 会比较并同步SU22 与SU24的不一致的内容.
四
问题解决的副产品
在追查问题的过程中, 发现系统有一个标准配置表TCDCOUPLES ,用来维护事务代码之间调用时,是否不检查授权,详见 CALL TRANSACTION 的帮助文档. 标准事务代码之间的调用会根据配置表 TCDCOUPLES确定调用时 WITH/WITHOUT AUTHORITY-CHECK.
五
总结
标准授权检查方式非常简单
通过语句检查授权对象的特定字段的值是否在用户拥有的角色(PFCG)中赋予给用户. 如果赋予了. 返回0 , 如果未赋予, 返回非0 . 但是有两种特殊情况会强制返回0(这个往往会被开发人员忽略,包括你么? ).
通过SU24 可以维护事务代码和授权对象的未检查标记.
调用事务代码时附加了WITHOUT AUTHORITY-CHECK 子句
授权检查的语句示例:
AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
ID 'BUKRS' FIELD l_bukrs
ID 'ACTVT' FIELD '03'.
在标准功能的增强中如果使用了授权检查,则必须用SU24核查一下要检查的权限对象是否维护了检查标记.以免增强无法达成预定的授权检查目标.
实际开发过程中, 如果发现某些简单的语句没有达成想要的效果. 仔细阅读一下该语句的帮助文档, 可以发现一些以前无意中忽略的功能或特性.
学习语言最重要的还是要仔细阅读该语言的语法帮助文档.
THE
END