简介:一份关于SAP权限维护的完整梳理文档,面向SAP系统管理员、ABAP开发人员及权限顾问。内容聚焦权限字段、权限对象、角色维护与授权分配,并辅以ABAP权限校验及ALV报表导出限制等实操场景,可帮助读者掌握从底层字段定义到程序级权限检查的完整链路。资源包仅含1个doc文档,整体大小348KB,内容结构紧凑,便于对照SAP事务代码逐步练习。目前已有1537人学习下载,适合需要系统理解SAP权限机制并快速落地的运维与开发人员。文档中详细展开了SU20字段维护、SU21对象创建、PFCG角色管理、用户比较激活,以及AUTHORITY-CHECK OBJECT语句的用法,并给出限制ALV导出的S_GUI权限对象配置,既有概念讲解又有操作要点,可作为日常权限维护与问题排查的速查手册。
1. 维护SAP权限对象:一次改动背后牵动的授权链
SAP维护权限对象,说白了就是在SU21里新建或修改一个“授权检查模板”。这个模板不直接显示在GUI界面上,却决定了用户能不能打开某个事务代码、能不能看某张报表、能不能改某条采购订单。很多人把它当成填表,实际上一个权限对象要经过“对象→授权值→参数文件→角色→用户主记录”五层传递,每层都可能断链。SAP GUI下载安装好,登录系统后按SU21进入维护,改动保存时还会自动生成传输请求,这就是为什么一条小权限改动能在生产环境翻车。本文写给做权限运维和BASIS的顾问,也写给被SU53困住、想知道一个对象到底该怎么维护的业务顾问。改错一个字段,授出去的权限就可能超界。
2. 拆解权限对象的结构:字段、活动值与检查过程
2.1 对象类、权限字段与25个字段上限:为什么字段越多授权越细
权限对象是SAP权限检查的原子单位。它定义了一组权限字段,ABAP程序在运行时用AUTHORITY-CHECK语句检查这些字段上带的值,通过就放行,不通过就把错误抛出来,并允许用户调用SU53查详情。权限对象本身必须挂在某个对象类下,对象类用SE21维护,自建对象建议全部放进Z开头的类,避免和SAP标准类混在一起,也让后续升级、测试和权限审计更容易识别出哪些是客户自维护的权限。
权限对象的结构有三个关键点。第一,一个权限对象最多放10个权限字段;如果需要控制更多业务维度,就要用字段组把多个表字段合并成一个权限字段,但合并后的原始字段总数不能超过25个。第二,权限字段必须引用系统里已存在的数据元素,不能随手写一个字符串。第三,第一个权限字段通常放活动类型ACTVT,它决定用户对这个对象能执行什么动作。
字段规划比填授权值更值得花时间。你想建一个对象控制用户对某张报表的显示权限,却不加ACTVT,那么PFCG生成角色时就没法表达“只读还是可写”。更麻烦的是,有的ABAP程序在运行时只检查ACTVT的某个值,比如03显示,你给用户授权时漏掉这个值,用户永远看到“没有显示权限”的报错,而你在对象定义里怎么都看不出问题。
25个字段上限在实践中是约束,也是一种保护。把物料主数据的几十个字段全塞进一个权限对象里,SU24和PFCG里的授权矩阵会膨胀得很厉害,每次授权都要滚屏勾选,用户主数据也会变得臃肿。常见做法是一个对象只控一个业务动作,比如“采购订单显示”“会计科目维护”,把相关字段收敛到一个对象里。业务需要多个动作时建两个对象,而不是硬堆字段。
2.2 授权值:X、星号和ACTVT活动值的含义与填法
权限对象定义好之后,真正起作用的是授权值。SAP里有几个特殊的授权值:星号表示所有值,X表示显式授权该字段的值,空白表示没有授权。在业务字段上,用星号最省事,但也是最大隐患,用户对该字段的任何值都有权限,等于把这一维度的边界全部放开。在ACTVT字段上,星号和X都很常见,因为用户要么完全不能做这个活动,要么能做所有活动。
ACTVT字段的取值有一套常用约定:01创建、02修改、03显示、04打印、05锁定、06删除,这套编码在SAP标准对象里广泛使用,自定义对象也沿用。PFCG维护角色时,生成授权建议会自动把ACTVT的值带出来;如果建议里缺失某个值,就要手工补。填授权值有一条铁律:给用户看的和允许用户改的,不要用同一个角色里的同一组授权堆在一起。比如“显示”对应03,“修改”对应02,两个值都填,用户既有读又有写,而业务需求只要读,这正是权限越界的常见来源。
| 授权值 | 含义 | 适用场景 |
|---|---|---|
| * | 字段的所有值 | 该字段不设边界,常用于ACTVT |
| X | 显式允许该字段的值 | 当字段只有单一值需要校验时使用 |
| 空白 | 无授权 | 该字段被跳过或不允许 |
| 01/02/03/... | ACTVT具体活动 | 创建、修改、显示、删除等操作 |
授权值填得多不一定出事,填得少一定出事。SAP按“对象上的字段值全部满足才算通过”的规则判断,只要有一个字段匹配不上,整个AUTHORITY-CHECK就返回失败。实际维护时,我会尽量少用星号,尤其在面向外部审计的权限分析里,星号展开出来的报表会让审计人员警觉,具体值反而容易解释。
授权值还有一个生效时机的问题。用户登录后,授权数据会加载到用户主记录的授权缓冲区里,也就是说,权限对象或授权值改完之后,不是马上对所有在线用户生效。要么用户重新登录,要么通过用户主记录里的参数文件刷新机制重新加载。这一点不弄明白,后面排查“权限明明改了,用户还是报错”时会绕很大的圈子。
2.3 AUTHORITY-CHECK:一个权限对象被检查的实际路径
只看SU21界面,很难理解权限对象到底怎么起作用。把检查路径写成一个最小示例就清楚了:
AUTHORITY-CHECK OBJECT 'S_TCODE' ID 'TCD' FIELD 'ME23N'. IF sy-subrc = 0. MESSAGE '有权限' TYPE 'I'. ELSEIF sy-subrc = 4. MESSAGE '无权限,请用SU53查看详情' TYPE 'E'. ENDIF.这个检查语句的语义是:针对权限对象S_TCODE,检查字段TCD上是否允许值ME23N。sy-subrc为0表示通过,4表示无授权,其它值通常表示对象不存在或者字段ID写错。权限对象维护里常见的问题“对象明明存在,程序却报对象不存在的错误”,多半是ABAP代码里写的字段ID和SU21里定义的字段ID不一致,大小写或末尾空格都会导致检查失败。
这段逻辑在企业里不会只出现在一处。事务代码启动检查、屏幕字段值校验、报表权限筛选,底层都是同一个AUTHORITY-CHECK机制。SU24和PFCG做的事情,就是把这个检查里用到的对象和字段值提前配置好,让角色生成时不需要手工逐个填值。理解了这一层,再看SU24的自动建议和PFCG的授权生成,就不觉得那是黑匣子了。
权限检查还会遇到“权限组变式”的概念,常见于S_TABU_DIS之类的表授权对象。排障时有人会把问题归结到权限对象上,其实和权限组的变式维护是另一条线。判断方法很简单:SU53报的是哪个对象名,就在SU21里查那个对象,不要被报错文案里其它词汇带偏。
3. 新建和修改权限对象:动手前先做的三类检查
3.1 先用SE93查事务代码:确认对象要挂在哪个T-code下
动手新建权限对象之前,先确认这个对象到底给哪个事务代码用。操作步骤是:在SAP GUI里输入SE93回车,输入目标事务代码,比如ME23N采购订单显示,或FS00会计科目维护,点显示之后,再点“授权对象”按钮,就能看到这个事务代码引用的标准权限对象列表。把对象名、字段名、现有建议值记录下来,再决定是复用还是新建。
绝大多数标准事务代码在开发环境已经挂好了权限对象,不需要新建。只有自定义事务代码或者标准对象覆盖不了的特殊业务,才需要新建权限对象。复用标准对象的好处是角色维护时可以直接沿用SU24的建议,PFCG里按事务代码授权就能自动生成,人力成本最低。自建对象适合的场景,一般是“业务员只能看自己负责的采购组织”这类标准对象表达不了的值范围控制。
有一个容易被忽略的点:SE93里显示的权限对象并不总是完整。程序代码里通过AUTHORITY-CHECK动态检查的对象,不一定全部登记在事务代码的事务属性里。所以要结合后续的ST01权限追踪做最终确认,不能因为SE93里没查到对象,就断言这个事务代码不检查权限。
3.2 用SE11和SE16N查字段来源:自建权限字段别凭空造
权限字段必须来自数据字典,不能凭空写一个业务描述。常见做法是:先用SE11查看拟作为权限字段的数据元素,确认字段类型、长度、值表;再用SE16N查看业务表里的实际数据,确认要授权的值在系统里真实存在;最后把权限字段定义到自定义数据元素上,或者复用标准数据元素。
权限字段引用的数据元素必须存在于数据字典中。实际维护时最常见的错误,是权限顾问在SU21的字段名里填了业务描述,比如“销售订单类型”,保存时直接报“数据元素不存在”。权限字段和表字段的映射关系还决定了PFCG里授权值从哪里来:字段有值表时,PFCG能读值表做下拉选择,授权操作直观很多;没有值表时,授权只能靠手工输入,容易输错。
这里还有一个字段级别的细节:权限字段的长度和数据元素长度不一致时,授权值会被截断。用户以为授权了VRT123456,系统实际保存了前8位,后面的业务值永远匹配不上,SU53又看不出差异,这种问题排查起来非常耗时。所以新字段定义好之后,先用SE16N确认业务值长度,再回SU21比对字段长度定义。
3.3 查对象类和命名空间:避免对象撞车和请求冲突
SAP对象命名空间分成客户命名空间和SAP命名空间。自建权限对象的名称和对象类都要用Z或Y开头,这是约定,也是保护。对象名建议按“Z_模块_业务对象”的格式,比如Z_MM_PO_SHOW、Z_FI_ACCOUNT_MAINT,一眼能看出用途;对象类也建一个Z开头的类,比如Z_OBJ_CLS,后续维护时权限分明。
先查对象名是否被占用,可以避免撞车带来的麻烦。在SU21里输入候选对象名搜索,如果已经存在,就要对比已有对象的结构,不要直接覆盖修改。另一个隐蔽的坑是请求锁冲突:同一个权限对象同时挂在两个传输请求里,释放后会出现在不同的目标系统上,产生对象版本不一致。保存前在stms里看一下当前请求的内容,确认没有重复锁定。
对象类选择也会影响后续维护效率。把自建对象全部放进一个Z开头的对象类,SUIM权限信息系统的查询、角色分析、升级前的对象导出都能按类过滤,比散落在标准类里好查得多。升级时,自建对象和标准对象分开比对,也不会互相干扰。
4. 在SU21、SU24、PFCG里走通权限对象维护:从对象定义到角色授权
4.1 SU21新建权限对象:对象类、字段、活动类型一次摆平
SU21是维护权限对象的主入口。登录SAP GUI后输入SU21,进入权限对象维护界面,新建一个对象需要填三件事:对象名、对象类、对象文本。对象名用Z开头,对象类从SE21维护过的类里选,对象文本写清楚用途,后续SU24和PFCG界面按文本检索时能否搜到,就看这一句写得是否清楚。
| SU21维护步骤 | 操作内容 | 说明 |
|---|---|---|
| 进入界面 | 输入SU21回车 | 权限对象维护主页面 |
| 新建对象 | 输入对象名、对象类、对象文本 | 对象名建议Z开头 |
| 添加字段 | 输入数据元素字段名 | 第一个字段通常为ACTVT |
| 保存 | 弹出传输请求选择框 | 新建请求或挂到已有请求 |
| 传输 | 在stms里释放任务 | 目标系统导入后生效 |
添加权限字段是一个一个加进去的。第一个字段放ACTVT已经说过;后面的字段按业务需要追加,最多10个。保存时,系统要求选择传输请求,这一步很多人忽略,以为保存就完事了。权限对象属于ABAP对象,传输链路上少一个环节,目标系统里就永远没有这个对象。
保存之后,开发系统里这个对象可以立即用来做AUTHORITY-CHECK测试,但目标系统必须等请求导入并激活才能识别。标准事务代码挂的对象建议直接复用,但是自建事务代码和自建权限对象之间的关联要手工维护,关联关系不是自动生成的。
4.2 SU24维护默认授权建议:给权限对象加“后悔药”
SU24按事务代码维护默认授权建议。PFCG里按事务代码授权时,系统会读这个建议,自动生成完整的授权数据。对自建权限对象来说,这一步不做,PFCG授权页签里就只能手工一个对象一个对象地填,维护成本高且容易漏。
SU24的操作路径是:输入事务代码回车,进入建议授权维护,选中权限对象,在字段值里填入建议的授权值。值填好之后,状态会从未修改变为已修改。审计时会关注这些已修改条目,建议在文本里标注清楚为什么改,是业务要求还是标准行为调整。
SU25和SU24是一对配合使用的工具。SU25负责把建议授权复制到活动的授权版本里,通常在执行系统拷贝、权限迁移或批量导入授权建议之后用。我的做法是:每建一个自建权限对象,就在SU24里给对应事务代码维护一条建议,然后顺序跑SU25把建议落到活动版本,再做PFCG角色验证。这条路径走通之后,以后建新角色几乎不用手工添加权限对象。
4.3 PFCG角色授权:把对象和授权值真正落到用户头上
PFCG授权页签支持两种做法:按事务代码授权和按权限对象授权。按事务代码授权时,PFCG读取SU24建议,把事务代码关联到的所有权限对象连同建议值一起带入授权数据;按权限对象授权时,直接手工添加一个对象,逐字段填值。自建权限对象的业务场景里,我几乎都用第一种,省时且不容易漏。
角色授权的操作步骤是:打开角色,进入授权页签,点更改授权数据,选择按事务代码,系统生成授权清单;检查清单里自建对象的ACTVT值和业务字段值,手工修正;保存授权后,点生成参数文件,输入参数文件名;最后用SU01把角色分配给用户,或者通过组织管理批量分配。
权限对象维护好、角色授权也生成好,并不等于用户马上能用。用户主记录里分配的是角色,真正执行权限检查的是参数文件。每次修改权限对象或授权值,都要回到PFCG重新生成参数文件,用户的授权数据才会更新。很多排障案例卡在最后一步,PFCG里已经显示新对象了,用户用的还是上一次生成的旧参数文件,自然人还是没权限。
5. 避坑:权限对象维护中最常见的5类故障排查
5.1 授权值填了星号和X,用户仍被SU53拒绝
现象:PFCG角色里权限对象的所有字段都填了星号,保存并生成参数文件后,用户重新登录,执行事务代码仍然报“无权限”,SU53里能看到具体的对象名和字段。
原因:第一种是授权值没有实际保存到参数文件,角色保存了,参数文件没有重新生成;第二种是SU53里显示的对象名和PFCG里维护的对象名不一致,大小写或首尾空格不同,让权限检查走了完全不同的对象。
解决:先SU53确认当前会话缺少的对象和字段,抄下精确的对象名;再回PFCG核对授权数据里的对象名是否一致;然后在PFCG里重新生成参数文件,最后用SU01查看用户主记录分配的参数文件名,确认是刚生成的新文件。
5.2 开发系统能过、生产系统报权限对象不存在
现象:自建权限对象在开发系统测试通过,传输到测试或生产环境后,用户执行相关事务代码,程序直接报“权限对象Z_XXX不存在”。
原因:对象没有传输到目标系统,或者传输了但对象未激活。权限对象不是主数据,它在ABAP字典的范畴内,目标系统导入后需要激活才能被AUTHORITY-CHECK识别。
解决:在源系统用stms检查请求状态,确认任务已释放并导入目标系统;如果导入成功仍报不存在,到目标系统SU21里查这个对象,对象存在但状态灰色,就说明没有激活,走ABAP工作台把它激活即可。
5.3 修改已有对象导致多个角色权限同时翻车
现象:为了给某个部门加权限,在SU21里给已有权限对象增加了一个字段,第二天发现多个无关角色的用户都无法执行事务代码了。
原因:这个权限对象被大量角色引用。增加字段后,旧授权数据里没有这个字段的值,ABAP程序执行AUTHORITY-CHECK时,新增字段匹配不上,相当于所有引用它的角色都少了权限。
解决:改已有对象之前,先用SUIM按权限对象查引用角色清单,评估影响范围;改完对象后,对所有引用角色重新生成参数文件,并补上新增字段的授权值;生产环境先在测试角色上验证,确认不影响原有权限后再批量调整。
5.4 自建对象命名不规范,系统升级时被覆盖
现象:ABAP系统升级后,用户登录被拒,SU53查出来是权限对象定义被替换成了SAP标准对象,自建的业务授权全部失效。
原因:对象名没有使用客户命名空间开头,与SAP后来发布的标准对象重名,升级时被覆盖,或者对象类的归属被标准对象侵占。
解决:对象名和对象类统一用Z开头,不要用S开头或其它保留前缀;每建一个权限对象,记录对象名、对象类、传输请求号;升级前用SE03导出所有Z开头的对象清单,和安装包里的标准对象做比对,提前发现冲突。
5.5 权限追踪一开,业务用户集体变慢
现象:为了排查权限问题,打开ST01权限追踪,生产系统响应变慢,数据库负载明显升高,连不带权限报错的用户也一起变慢。
原因:ST01把整个系统的权限检查全部记录下来,写审计文件的IO开销被放大,生产机共享资源被追踪日志占用。
解决:只在特定用户、特定时间段内开启ST01追踪,事件只勾选AUTH_CHECK一项,关掉其它所有事件类别;追踪结束后立即关闭,把日志导出到本地分析,不要在生产环境长时间挂机。
6. 验证一个权限对象真的可用:SU53、权限追踪与ABAP检查
6.1 先SU53,再ST01,最后用ABAP报表直接验证
验证一个权限对象是否真正可用,顺序有讲究。用户报错时先SU53,看当前会话缺少哪个对象、哪个字段、哪个值;SU53没有输出时,用ST01权限追踪确认程序是否抛出了AUTHORITY-CHECK;最后用ABAP报表直接检查对象在指定值上的通过情况。
6.2 一个可以直接执行的ABAP检查报表
REPORT z_auth_check. PARAMETERS p_obj TYPE xuobject OBLIGATORY DEFAULT 'S_TCODE'. PARAMETERS p_fld TYPE xufield OBLIGATORY DEFAULT 'TCD'. PARAMETERS p_val TYPE xufieldvalue OBLIGATORY DEFAULT 'ME23N'. AUTHORITY-CHECK OBJECT p_obj ID p_fld FIELD p_val. IF sy-subrc = 0. WRITE: / '有权:', p_obj, '/', p_fld, '/', p_val. ELSEIF sy-subrc = 4. WRITE: / '无权:', p_obj, '/', p_fld, '/', p_val. ELSE. WRITE: / '检查失败:对象或字段不存在,sy-subrc=', sy-subrc. ENDIF.参数说明:p_obj输入要验证的权限对象名,p_fld输入权限字段名,p_val输入要测试的授权值。执行前需要把这三个参数替换成实际值,比如自建对象Z_MM_PO_SHOW里的字段ACTVT,p_val填03。权限对象通常有多个字段,这个报表一次只验证一个字段;多字段对象要写成多行AUTHORITY-CHECK,逻辑上和程序实际执行的检查保持一致。
逻辑说明:S_TCODE对象只有一个字段TCD,p_val填ME23N就能验证当前用户能否执行该事务代码。对自建对象,验证结果返回“有权”不代表整条业务链路一定通,因为程序可能在后面又检查了其它字段或其它对象。真正上线前,仍要回到SU53看最终用户报错,两次结论对照才可靠。
权限对象改动的翻车,大多不是对象本身写错,而是“对象→建议→角色→参数文件→用户”这条链上断了某一环。现在我每次新建或修改权限对象,都会先做引用查询,再改对象,然后在测试角色上验证,最后用SU53和ST01两条路径确认。这套验证路径帮我在权限维护这件事上少走了很多弯路,权限维护也从“玄学”变成了流程化操作。希望帮到你。
本文还有配套的精品资源,点击获取