OData服务AUTHORITY-CHECK异常:移除用户权限后仍可访问排查
OData服务DPC_EXT类权限检查失效问题排查
问题回顾
在OData服务的DPC_EXT类中,为todos实体的todosset_get_entity方法实现了基于S_TABU_NAM对象的权限检查,代码如下:
METHOD todosset_get_entity. AUTHORITY-CHECK OBJECT 'S_TABU_NAM' ID 'ACTVT' FIELD '03' ID 'TABLE' FIELD 'ZALM_FS_TODOS'. IF sy-subrc <> 0. MESSAGE |No Authorization access! | TYPE 'E'. * Implement a suitable exception handling here ENDIF.
首次测试权限检查生效,但移除用户对应角色(已执行权限失效、重新生成权限文件操作)后,用户仍能获取数据;修改TABLE字段值为ZALM_FS_TODOS或ZALM_FS_USERS时,权限检查结果无差异。
排查及解决步骤
- 清理用户权限缓存:ABAP系统会缓存用户权限,移除角色后需强制重置。使用事务码
SU56,输入用户名后点击「重置用户缓冲区」;或执行代码:CALL FUNCTION 'AUTHORITY_CHECK_RESET_BUFFER' EXPORTING username = sy-uname. - 重新生成OData运行时类:打开事务码
SEGW,找到对应项目并点击「生成」按钮,重新生成所有相关运行时对象,确保修改的DPC_EXT代码被正确加载。 - 校验权限对象配置:
- 用事务码
SU01查看用户权限概览,确认是否通过其他角色继承了S_TABU_NAM中目标表的权限 - 检查角色中
S_TABU_NAM的设置,是否存在通配符(如*)导致的全量权限,或移除角色时未彻底删除对应权限条目
- 用事务码
- 清理OData服务缓存:使用事务码
/IWFND/CACHE_CLEANUP清理服务缓存,或通过/IWFND/MAINT_SERVICE找到对应服务后点击「清除缓存」 - 优化权限异常抛出逻辑:原代码使用
MESSAGE TYPE 'E'可能在OData场景下未正确终止请求,建议替换为标准异常:
IF sy-subrc <> 0. RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception EXPORTING textid = /iwbep/cx_mgw_busi_exception=>authorization_failed. ENDIF.
内容的提问来源于stack exchange,提问作者MarcL
相关产品推荐
相关产品推荐

