本文目录
业务场景:需要给报表添加权限管控,没有工厂权限的用户使用该事务码查询不到对应的数据。
一、修改代码
①确定权限管控的位置:一般权限检查写在最开始,在START OF SELECTION部分;也可以选择在处理数据后,ALV前加上权限检查并过滤数据。
②SU21查看权限对象,或者PFCG里面查看,找到需要的权限对象M_BEST_WRK
③在代码里面可以调用这个权限检查
①写在取数后,这样有个缺点是高级管理员也会被限制在这里
FORM frm_auth_check .
* 权限检查并过滤数据
AUTHORITY-CHECK OBJECT 'M_BEST_WRK'
ID 'ACTVT' FIELD '03'
ID 'WERKS' FIELD '1010'.
IF sy-subrc <> 0.
DELETE gt_out WHERE werks = '1010'..
ELSE .
DELETE gt_out WHERE werks = '1110' .
ENDIF.
AUTHORITY-CHECK OBJECT 'M_BEST_WRK'
ID 'ACTVT' FIELD '03'
ID 'WERKS' FIELD '9001'.
IF sy-subrc <> 0.
DELETE gt_out WHERE werks = '9001'.
ELSE .
DELETE gt_out WHERE werks ='9002'.
ENDIF.
ENDFORM.
②在取数前最开始判断,分两步:如果查询界面有输入工厂,你就检查它输入的工厂有没有权限,如果没有输入,就找所有的,然后把值赋给S_WERKS
IF s_werks IS NOT INITIAL.
SELECT *
INTO TABLE @DATA(lt_t001w)
FROM t001w
WHERE werks IN @s_werks.
CLEAR: r_werks[].
LOOP AT lt_t001w INTO DATA(ls_t001w).
AUTHORITY-CHECK OBJECT 'M_BEST_WRK'
ID 'WERKS' FIELD ls_t001w-werks.
IF sy-subrc <> 0.
* MESSAGE |该用户没有工厂{ ls_t024e-ekorg }的权限!| TYPE 'E'.
ELSE.
r_werks[] = VALUE #( BASE r_werks[] ( sign = 'I' option = 'EQ' low = ls_t001w-werks ) ).
ENDIF.
ENDLOOP.
IF r_werks[] IS INITIAL.
MESSAGE |无对应的工厂权限,请重新输入!| TYPE 'E'.
ENDIF.
ELSE.
SELECT *
INTO TABLE @lt_t001w
FROM t001w
WHERE werks IN @s_werks.
CLEAR: r_werks[].
LOOP AT lt_t001w INTO ls_t001w.
AUTHORITY-CHECK OBJECT 'M_BEST_WRK'
ID 'WERKS' FIELD ls_t001w-werks.
IF sy-subrc <> 0.
ELSE.
r_werks[] = VALUE #( BASE r_werks[] ( sign = 'I' option = 'EQ' low = ls_t001w-werks ) ).
ENDIF.
ENDLOOP.
ENDIF.
IF s_werks IS INITIAL.
s_werks[] = r_werks[].
ENDIF.
二、创建用户角色并测试
①su01 创建角色、设置好姓名和初始密码,点击保存退出。
②进入PFCG里面维护 点击菜单,检查里面有没有可使用的事务码,没有就添加上。
③点击用户,吧创建的角色填入,角色校验(角色对比)后出现绿色才是可使用的,如果这一步不能进行角色校验,可以进行完④的时候再进行。
④点击权限,更改权限数据里面检查是否有M_BEST_WRK,退出前一定要点击生成参数文件才算成功,返回最开始界面都是绿色标志,表示可以使用。
三、对更改后的代码进行测试
这里解释一下为什么要创建角色才进行测试程序:写程序的我们属于高级管理员,具有所有的权限,能看到所有的工厂数据。
测试的结果是创建的角色它的权限对象工厂包含了哪个工厂,屏幕界面什么都不输进入报表也只有所在工厂的数据会显示出来,如果输入了其他工厂查询,也会没有数据。
补充示例:给用户增加权限
①显示用户权限 SU53,查询用户拥有权限的字段,记录没有的权限对象字段。
②SU01 进入到用户维护界面,输入用户工号,点击,进入到显示角色,点击权限修改,或者直接事务码PFCG,也能进入到权限修改界面。
完成。