ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SAP权限对象维护实战:从SU21定义到PFCG授权链路避坑

SAP权限对象维护实战:从SU21定义到PFCG授权链路避坑 简介一份关于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两个值都填用户既有读又有写而业务需求只要读这正是权限越界的常见来源。授权值含义适用场景*字段的所有值该字段不设边界常用于ACTVTX显式允许该字段的值当字段只有单一值需要校验时使用空白无授权该字段被跳过或不允许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里的字段ACTVTp_val填03。权限对象通常有多个字段这个报表一次只验证一个字段多字段对象要写成多行AUTHORITY-CHECK逻辑上和程序实际执行的检查保持一致。逻辑说明S_TCODE对象只有一个字段TCDp_val填ME23N就能验证当前用户能否执行该事务代码。对自建对象验证结果返回“有权”不代表整条业务链路一定通因为程序可能在后面又检查了其它字段或其它对象。真正上线前仍要回到SU53看最终用户报错两次结论对照才可靠。权限对象改动的翻车大多不是对象本身写错而是“对象→建议→角色→参数文件→用户”这条链上断了某一环。现在我每次新建或修改权限对象都会先做引用查询再改对象然后在测试角色上验证最后用SU53和ST01两条路径确认。这套验证路径帮我在权限维护这件事上少走了很多弯路权限维护也从“玄学”变成了流程化操作。希望帮到你。本文还有配套的精品资源点击获取
返回列表