SAP用户权限控制设置及开发
创建用户SU01
事务码:SU01,用户主数据的维护,可以创建、修改、删除、锁定、解锁、修改密码等
缺省:可以设置用户的起始菜单、登录的默认语言、数字显示格式、以及日期和时间的格式设置
参数:SAP很多屏幕字段都会对应一个指定的参数ID,该参数ID及值一般存储在SAP所划分的内存区域中,在SAP GUI启动时会自动读取,并作为默认值自动赋值给屏幕上相关字段中,如SD中销售组织参数ID为VKO,HR国家分组参数ID为MOL:
注:一个角色只对应一个参数文件
权限角色
用户的权限菜单是通过权限角色分配来实现的
自定义权限角色 PFCG
事务码:PFCG
SAP针对不同的功能模块提供了很多内置的角色,如SD模块的权限角色名都是以 SAP_SD 为前缀,HR模块以 SAP_HR为前缀。
在实际应用中,往往会开发很多的工具和报表,并且需要对这些特定的程序进行权限分配,本节将通过新建一个自定义的角色来介绍用户角色权限维护细节。
角色维护又分为单一角色和复合角色,单一角色是一个独立的权限对象,而复合角色可以由多个单一角色组合而成,能够同时继承不同单一角色的权限。下面创建一个SD的角色:
为角色分配菜单权限
为角色分配权限数据
上面分配完菜单后,就实现了在用户菜单中能看到的相关事务码菜单项,但是能否操作菜单中所对应事务的业务数据还得设置具体的权限数据:
为某个角色分配具体的权限数据后,会自动产生一个参数文件,SAP在执行中会通过读取该参数文件的数据来进行用户权限的检查及管控。
在进行更改“权限数据”前,先简单了解一下SAP的权限对象(权限对象设置好后,需要绑定到事务码上,然后在ABAP程序中是通过AUTHORITY-CHECK OBJECT语句来做权限检查的,这样权限对象就起作用了):
在SAP实际应用中,用户所直接操作的是屏幕及屏幕所对应的字段,而这些具体字段都是由权限对象进行控制,包括该字段所允许的操作及允许的值(数据)。
本例中为角色分配了事务VA01——创建销售订单,在创建销售单时需要输入具体的组织级别,在“权限”页签中单击“更改权限数据”按钮,系统将自动抓取该角色菜单中所分配的所有事务码所对应的权限对象,会弹出一个定义组织级别对话框,要求用户输入具体的业务数据控制范围,如:
为权限字段分配值可以是单个值,也可以是某个取值范围,输入符号“*”表示为该字段允许所有值,也可以单击对话框右下角的“完全权限”按钮,为还没有分配的值的字段分配值。注:这个界面填充的值会带到下一界面,也可以在这里什么不输,而是直接到下一界面输入,这里只是将所分配的事物码所涉及的权限对象的权限字段集中在这是输入值,只是为了方便
SAP角色的权限分配是从权限对象直接派生过来的,可以在不同的权限角色中同时调用同一权限对象,并为所生成对象分配定义不同的权限值。
点击“保存”后,SAP会将权限对象以及所维护的权限值以树状结构分层列出,最顶级为对象类,对象类是同类属性的权限对象的集合,一个对象类可以包含多个权限对象。在权限角色维护页面的主菜单中执行“实用程序|技术名称打开”命令,将在每个字段的右边显示所有的对象类名称及权限对象名称:
该界面通过状态灯来表示各权限对象维护状态,绿灯代表激活,黄色表示未激活,红色代表未给权限字段分配值,单击权限字段前的铅笔可以定义该字段的授权值:
权限对象维护完成后,节点的状态灯会变为绿色,单击“保存”按钮后会弹出一个“为生成权限参数文件分配参数文件名称”对话框:
再点击,激活权限数据,返回到角色维护界面,可以看到生成的权限参数文件:
将角色分配给用户
先创建新的用户 800USER02 但角色与参数文件都为空:
(注:当角色创建好以后,除了在PFCG里分给其他用户外,实质上可以直接通过SU01来对某用户进行角色的分配:
,当分配好角色时,该角色所带的参数文件也会自动带过来放在参数文件Tab中,但你也可以在参数文件中还可以直接将其他的参数文件加进来,如SAP_ALL、SAP_NEW参数文件)
由于没有赋任何权限,所以此时800USER02没有任何权限:
单击“用户比较”按钮,将弹出“比较角色用户主数据记录”对话框:
点击“完成比较”,该用户所对应的权限角色将正式生效。
完成后,再去查看 800USER02 用户的角色与参数文件页签,发现已关联上了:
通过上面的设置后,800USER02用户才有权执行VA01、VA02两个事务码,但是,由于前面数据权限字段“销售凭证类型”没有设置任何值,所以在创建时还是会报错:
可以将该凭证类型值加上即可:
权限角色在系统间的传输
自定义权限对象
前面已经介绍了如何在权限角色中维护SAP所提供的标准权限对象,本节介绍如何自定义权限对象。
SU20:权限字段清单,可以新增、修改、删除权限字段,可以浏览该字段具体被哪些权限对象所调用。
SU21:维护权限对象,可以创建和维护权限类、权限对象,权限字段在该事务码中被分配到权限对象
SU22:维护权限对象的分配,可以通过该事务码为具体事务分配权限对象
权限字段的维护SU20
创建权限字段:
对象类及权限对象的维护SU21
对象类是多个权限对象的集合,而一个权限对象又可以分配多个权限字段,对象类和权限对象都是通过事务码SU21来维护的。
一旦新增了用户的自定义权限对象后,需要单击工具栏中的按钮,将把新增的权限对象赋值给 SAP_ALL 这个权限参数文件。
创建对象类:
创建权限对象:
将权限对象分配到事务码SU22
SU22:通过该事务码还可以查询某个事务有哪些权限对象
为了下面的演示,创建一个HELLO程序事务代码ZJZJ_HELLO:
输入事务码ZJZJ_HELLO后,执行该程序后进入权限对象分配页面,对于新增的事务,SAP都会默认分配一个S_TCODE权限对象,用于管控用户操作是否存在该事务的权限:
可为权限字段设置默认值,这些值会在角色权限分配时自动带出:
通过上面创建完自定义的权限对象ZS001,并将它与事务代码ZJZJ_HELLO绑定,这样就可以将该事务代码分配到角色菜单中了(注:到目前为止,上面只是设置了某个事务码具体的权限数据,要使用这些权限数据的起作用,还得要通过该事务码所对应的ABAP程序来检查所分配的权限对象的权限数据,标准的Tcod不需另写ABAP,默认对应的ABAP程序已经实现了?)
权限对象(Authorization Object),权限字段(Authorization Field),允许的操作(Activity),允许的值(Field Value)
角色包含了若干权限对象,在透明表AGR_1250中有存储二者之间的关系;权限对象包含了若干权限字段、允许的操作和允许的值,在透明表 AGR_1251中体现了ROLE/Object/Field/Value之间的关系;有一个特殊的权限对象用来包含了若干事务码。这个权限对象叫 “S_TCODE”,该权限对象的权限字段叫“TCD”,该字段允许的值(Field Value)存放的就是事务代码;有一种特殊的权限字段用来表示可以针对该权限对象做哪些操作,是允许创建、修改、显示、删除或者其他呢,该权限字段叫 “ACTVT”,该字段允许的值(Field Value)存放的就是允许操作的代码,01代表创建、02代表修改、03代表显示等;SAP 系统自带了若干权限对象、默认控制了若干权限字段(对应到透明表的某些字段)。可以用事务码SU20来查看系统有哪些权限字段,用SU21来查看系统有哪些默认的权限对象。于是我们知道了事务代码与权限对象的区别。从权限控制的范畴来看,事务代码属于一种特殊的权限对象;一个事务代码在执行过程中,为了判断某个ID是否有权限执行此事务代码,还可能检查其他若干普通的权限对象。使用SU22来查看某个事务代码包含了哪些权限对象。在透明表USOBX中,存放了事务码与权限对象的对应关系。
自定义权限对象
上文所说的系统自带权限对象与权限字段仅能满足有限的需要,其权限审核的逻辑也是系统硬编码了的,我们能做的只是是否启用某项权限对象的检查(使用SU22)。如果需要自定义,通过SU20、SU21定义即可。调用的时候在程序中加入类似代码:
AUTHORITY-CHECK OBJECT 'Z_VKORG' ID 'VKORG' FIELD 'REC_VKORG-VKORG'.
IF SY-SUBRC <> 0.
MESSAGE 'No Authorization!' TYPE 'E'.
ENDIF.
BW授权
BW标准授权(即操作授权)
控制用户是否可以修改、创建、查看报表
通过角色模板生成权限数据
上面(为角色分配菜单权限/为角色分配权限数据)是根据你选择的事务码(菜单)后,再进“权限”Tab点击“更改权限数据”时,会自动搜集该事务码所用到的权限对象所用来的组织结构权限字段罗列出来,在弹出组织级别值维护框中输入权限范围,则在角色权限数据维护树里,这会自动会使用这些值(当然也可以不在此框中进行设定,直接跳到角色权限数据维护树里进行设置)。我们这里是给报表设置权限,没有对应于哪个具体的TCD,所以只能过角色模板(角色模板其实就是为了控制某个应用功能所需要的权限对象集),或者在知道某个应用需要哪些权限对象时手动加入这些权限对象而不需要通过模块来设置(请参考后面):
但点击更改权限数据时,会弹出框,可以选择一个角色模板,可以基于此模板进行权限数据的设定:
选择S_RS_RREDE模板(该模板就是用来控制前端报表人员权限的),再点“采用参照”,就可以基于模板进行权限数据维护了(如果选择“不要选择模板”,则需手动加入所需要的权限对象,这个可以参考后面相应章节)。打开模板后,仅需对下面两个权限对象(S_RS_COMP、S_RS_COMP1)进行权限数据设置即可,以下是模板默认值:
模板中S_RS_COMP权限数据有两组,多组方便灵活控制权限数据,一般只有一组权限数据,如果需要多组,则可以通过以下方式来让同一权限对象有多组权限数据:
上面有两组权限数据,当有多组数据时,如果某个权限在两组都有,最终的权限是叠加的的
S_RS_COMP权限对象: 每个权限对象的每个权限字段的业务含义是不一样的,但一般都会有ACTVT这个权限字段,该权限字段就是控制是否可以增、删、改、查等这些权限的,其它权限字段的含义请通过SUIM事务码来查看该权限对象的文档说明:
下面只可查询报表(权限参数“报告组件的类型”“查询”,即Query,表示报表组件)(注:一定要将执行勾上,否则查不出结果),不可新增、修改、删除报表:
下面加上了可删除、创建、修改报表功能权限:
发现一个有趣现象:删除权限包含了修改权限?只要你勾上了删除,不勾修改,一样可以修改;但反过来不行:只勾修改,不勾删除,还是不能删除:
下面权限情况下,不能通过报表工具创建、删除、修改变量(但查询时可以使用):
S_RS_COMP1权限对应是对 S_RS_COMP权限对象的一种补充:即限制只准操作哪些人创建的报表
手动添加权限对象
前提是要知道该项功能需要用到哪些权限对象,可以使用SU22来查。上面模式权限用到了以下几个主要的权限对象,手动将他们加进去即可:
权限对象:S_RS_COMP
S_RS_COMP1
S_RFC
S_TCODE
事务代码:RRMX 这个事务代码是必须的,用它来打开查询分析器的代码。
自定义的权限和基于模板的一样。
BW分析授权
分析授权:限制报表用户只能看那些数据?
执行rsecadmin事务码:
回到报表设计工具,针对客户字段创建权限变量(权限变量的作用就是说创建的变量的值不用在界面上输入,而值是来自于分析权授权所分配的权限值):
注:如果你的标准授权是使用的是BW授权模板来创建的标准授权,则还是会查询出所有数据,因为授权模板中S_RS_AUTH授权对应中BIAUTH权限字段默认的值就是0BI_ALL,这是一个系统提供的标准分析对象,是可以查看所有权限的分析对象:
所以通过模板创建的标准授权是不行的,所以只能是手工加载一些必要的授权对象后来进行标准授权
注:分析授权除了通过rsecadmin将其分配个用户外:
也可以将分析权限直接分配到BW模板权限中的S_RS_AUTH中:
并将用户直接分配的分析授权删除掉(rsecadmin),其结果还是可控:
这样分析权限就没有直接分配到某个人了,而是将其分配给标准授权,而标准授权是与用户相关的,所以最终分析权限就会间接与用户相关连了,下面是用户所分配的标准授权:
在程序中调用权限对象
在很多SAP标准程序中,已经存在了对权限数据的调用及管控功能
在程序中可以通过ABAP程序编辑器快速插入调用权限的代码:
权限代码需要放在AT SELECTION-SCREEN.事件块里
AUTHORITY-CHECK OBJECT '<object>'
ID '<name1>' FIELD <f1>
ID '<name2>' FIELD <f2>
.............
ID '<name10>' FIELD <f10>.
<object>为检查的权限对象。你必须将所有的权限字段(<name1>,<name2> ...)列出来。<f1>,<f2>....为相应权限字段的值。AUTHORITY-CHECK语句会根据user’s profile来检查权限对象的权限字段,看用户是否对给出的<f1>,<f2>....权限字段值是否有权限。如果不想对某个权限字段进行权限检查,可以使用DUMMY来代替FIELD <f>。
AT SELECTION-SCREEN.
PERFORM frm_auth_check.
FORM frm_auth_check .
data: l_werks type werks,
c_text1(60) type c value 'You have no authorization in Plant:'.
select werks
from t001w
into l_werks
where werks in s_werks.
authority-check object 'ZDABAP'
id 'VKORG' dummy
id 'BUKRS' dummy
id 'WERKS' field l_werks
id 'EKORG' dummy
id 'KOKRS' dummy
id 'GSBER' dummy
id 'SEGMENT' dummy.
if sy-subrc <> 0.
message e001(00) with c_text1 l_werks.
endif.
endselect.
endform.
form frm_auth_check .
data: begin of lt_bukrs occurs 0,
bukrs type t001-bukrs,
end of lt_bukrs.
select bukrs from t001 into corresponding fields of table lt_bukrs where bukrs in s_bukrs.
loop at lt_bukrs.
authority-check object 'ZDABAP'
id 'VKORG' dummy
id 'BUKRS' field lt_bukrs-bukrs
id 'WERKS' dummy
id 'EKORG' dummy
id 'KOKRS' dummy
id 'GSBER' dummy
id 'SEGMENT' dummy.
if sy-subrc <> 0."
message s001(00) display like 'E' with 'You do not have authorization to access company code:' lt_bukrs-bukrs.
stop.
endif.
endloop.
endform.
通过程序检查是否有权执行某个Tcd
在ABAP代码中所有调用SAP事务处理命令的地方,都需要事先进行详细的授权检查(调用S_TCODE权限对象来实现),以确认当前用户是否拥有执行此命令所必须的权限:
CALL TRANSACTION ‘SU10’.
增加一段AUTHORITY-CHECK代码:
AUTHORITY-CHECK OBJECT 'S_TCODE
ID 'TCD'
FIELD 'SU10'.
IF sy-subrc = 0.
CALL TRANSACTION 'SU10'.
ENDIF.
这样就可以在调用前确定当前用户是否有权执行。
在程序中读取权限对象所设定的权限值
GET_AUTH_VALUES
返回该权限对象中的所有权限字段以及该字段所对应的权限值。
用户权限缺失检查SU53
建议为所有用户角色分配分配该事务的权限,以方便管理员在出现权限问题时及时核查。
在执行事务时出现权限检查错误后,输入事务代码SU53,则会显示权限评估检查结果:
用户、角色、权限对象、事务等之间的关系查看 SUIM
如:查看某个事务代码被分配到了哪些角色:SUIM