为什么AUTHORITY-CHECK给出的结果与功能模块AUTHORITY_CHECK不同?

2020-08-22 16:01发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们有时对具有活动性'03'(或'02')的S_DEVELOP使用AUTHORITY-CHECK来控制是否应打开选择屏幕上的字段以供输入:

 *只有开发人员可以更改要选择的最大项目数
   权限检查对象" S_DEVELOP"
            ID" DEVCLASS"假人
            ID" OBJTYPE"假人
            ID" OBJNAME" DUMMY
            ID'P_GROUP'DUMMY
            ID" ACTVT"字段" 03"。

   IF sy-subrc NE 0。
     将屏幕环入数据(ls_screen)。
       IF ls_screen-group1 EQ'DEV'。
         ls_screen-input ='0'。
         从ls_screen修改屏幕。
       万一。
     结局。
   万一。
 

现在,我们在测试期间遇到了一个案例,该案例中,不是开发人员的用户通过了SY-SUBRC = 0的检查,并且我们不明白为什么会这样,因为我们看不到与开发人员相关的情况 在他的个人资料中扮演的角色。 如果我们通过SE37和功能模块AUTHORITY_CHECK以及ID和FIELD的相应值来检查用户,则将返回预期的错误USER_NOT_AUTHORIZED:

程序和功能模块中的实际权限检查不会产生相同的结果吗? 说实话,我发现他们没有这样做是"令人不安的"! 还是我们错过了什么? 是的,我注意到FM未"发布"。

我试图找到有关此内容的信息,但是在搜索" Authority-check"时找到的许多匹配项确实有点困难!

我们正在使用NW750 EHP8

非常感谢和欢呼

贝尔贝尔

fm-authority-check.jpg (76.3 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们有时对具有活动性'03'(或'02')的S_DEVELOP使用AUTHORITY-CHECK来控制是否应打开选择屏幕上的字段以供输入:

 *只有开发人员可以更改要选择的最大项目数
   权限检查对象" S_DEVELOP"
            ID" DEVCLASS"假人
            ID" OBJTYPE"假人
            ID" OBJNAME" DUMMY
            ID'P_GROUP'DUMMY
            ID" ACTVT"字段" 03"。

   IF sy-subrc NE 0。
     将屏幕环入数据(ls_screen)。
       IF ls_screen-group1 EQ'DEV'。
         ls_screen-input ='0'。
         从ls_screen修改屏幕。
       万一。
     结局。
   万一。
 

现在,我们在测试期间遇到了一个案例,该案例中,不是开发人员的用户通过了SY-SUBRC = 0的检查,并且我们不明白为什么会这样,因为我们看不到与开发人员相关的情况 在他的个人资料中扮演的角色。 如果我们通过SE37和功能模块AUTHORITY_CHECK以及ID和FIELD的相应值来检查用户,则将返回预期的错误USER_NOT_AUTHORIZED:

程序和功能模块中的实际权限检查不会产生相同的结果吗? 说实话,我发现他们没有这样做是"令人不安的"! 还是我们错过了什么? 是的,我注意到FM未"发布"。

我试图找到有关此内容的信息,但是在搜索" Authority-check"时找到的许多匹配项确实有点困难!

我们正在使用NW750 EHP8

非常感谢和欢呼

贝尔贝尔

fm-authority-check.jpg (76.3 kB)
付费偷看设置
发送
7条回答
野沐沐
1楼 · 2020-08-22 16:50.采纳回答

TL; DR

AUTHORITY-CHECK(ABAP语句)的摘要=在AUTHORITY_CHECK(功能模块)中未提及授权字段。

长版本

在7.52中,如果未传递参数USER(或将其设置为SY-UNAME),则功能模块AUTHORITY_CHECK的代码严格等于:

权限检查对象object
           id field1字段value1
           id field2字段value2
           id field3字段value3
           id field4字段value4
           id field5字段value5
           id field6字段value6
           id field7字段value7
           id field8字段value8
           id field9字段value9
           id field10字段value10。
 

因此,您可以假定AUTHORITY-CHECK没有任何区别。

您的代码的主要区别在于DUMMY。 如果您将参数设置为'DUMMY'调用AUTHORITY_CHECK,则等效于:

 AUTHORITY-CHECK OBJECT'S_DEVELOP'
            ID" DEVCLASS"字段" DUMMY"
            ID" OBJTYPE"字段" DUMMY"
            ID" OBJNAME"字段" DUMMY"
            ID" P_GROUP"字段" DUMMY"
            ID'ACTVT'字段'03'。

,这意味着必须至少有一个授权,其中DEVCLASS字段与'DUMMY'相匹配,而OBJTYPE字段与'DUMMY'相匹配,等等。 这根本不等于您的要求:

权限检查对象" S_DEVELOP"
            ID" DEVCLASS"假人
            ID" OBJTYPE"假人
            ID" OBJNAME" DUMMY
            ID'P_GROUP'DUMMY
            ID'ACTVT'字段'03'。

严格等同于:

权限检查对象'S_DEVELOP'
            ID" ACTVT"字段" 03"。
 

或者甚至更不直观(因为它不在ABAP文档中,因此也不太正式,但是可以从SAP注释 1022413-使AUTHORITY-CHECK和AUTHORITY_CHECK保持一致,"从AUTHORITY_CHECK代码中调用函数模块AUTHORITY_CHECK时可以实现相同的结果",以:

权限检查对象" S_DEVELOP"
            ID``领域''
            ID``领域''
            ID``领域''
            ID``领域''
            ID" ACTVT"字段" 03"。
 

因此,您的要求严格等于:

呼叫功能'AUTHORITY_CHECK'
   出口
     对象='S_DEVELOP'
     field1 ='ACTVT'
     value1 ='03'。

调用函数" AUTHORITY_CHECK"
   出口
     对象='S_DEVELOP'
     field5 ='ACTVT'
     value5 ='03'。

甚至:

呼叫功能'AUTHORITY_CHECK'
   出口
     对象='S_DEVELOP'
     field1 =''
     value1 =''
     field2 =''
     value2 =''
     field3 =''
     value3 =''
     field4 =''
     value4 =''
     field5 ='ACTVT'
     值5 ='03'。

NB:下一个错误,因为它查找包含包含真实空间值('')的字段的授权:

 AUTHORITY-CHECK OBJECT'  S_DEVELOP'
            ID'DEVCLASS'字段''
            ID'OBJTYPE'字段''
            ID'OBJNAME'字段''
            ID'P_GROUP'字段''
            ID" ACTVT"字段" 03"。
木偶小白
2楼-- · 2020-08-22 16:26

弗雷德里克·吉罗德

< p> LOL,Fred!

还没有尝试过ST01跟踪-IIRC-我们无权运行auth-trace。 但是,我们是通过调试来查看它的,所以我冒昧地猜测我们在正确的程序中。 我认为ABAP代码中的权限检查实际上触发了内核功能,因此FM是一个完全不同的实体。 我只是感到惊讶,无论如何它们都不会给出相同的结果。

野沐沐
3楼-- · 2020-08-22 16:26

由用户执行了哪些交易,可以定义某些交易(和其他对象)以覆盖权限检查, 调用SU24进行交易,然后查看"检查指示器"列,是否有一些授权对象标记为"不检查"? (注意:配置文件参数AUTH/NO_CHECK_IN_SOME_CASES会激活此行为,请使用RZ10或询问基础)。

如果不允许使用ST01,是否还使用SU53(或SU56进行缓冲区分析)进行了检查,以防意外成功

lukcy2020
4楼-- · 2020-08-22 16:51

是否在程序发生时进行权限检查? 也许用户在执行程序之前找到了避免这种情况的方法...

bbpeas
5楼-- · 2020-08-22 16:34

Frederic Girod

它是在AT SELECTION-SCREEN OUTPUT中完成的,并且处理了该事件中的其他逻辑,因此也应进行auth-check。 但是,正如下面在我对Raymond的答复中提到的那样,由于在此期间更改了代码,我们无法再进行测试。

哎,真难
6楼-- · 2020-08-22 16:37

Sandra Rossi

感谢您的详细解释,Sandra! 我敢肯定,这不仅对我有帮助,而且对其他人也为微妙的差异感到困惑!

因此,当用户的支票以支票的功能模块版本返回"无授权"时, 原因是因为他没有授权对" DUMMY"进行检查,而不是因为我们认为的活动(或错误地得出结论!)。

干杯

Bärbel

代楠1984
7楼-- · 2020-08-22 16:37

开发人员很少为特定交易输入SU24。 遗憾的是,PFCG在创建角色时会使用除文档角色之外在此输入的信息。

一周热门 更多>