Programming Authorization Checks,在 ABAP 代码里把权限检查写扎实
最近在看一段旅行预订相关的 ABAP 代码时,有个很典型的需求摆在眼前,业务客户的订票记录不能被所有人随便修改。能显示,不一定能修改。能修改普通客户,也不一定能修改商务客户。权限设计如果只停留在菜单级别,代码里没有真正落地,到了生产系统就很容易出现一种尴尬局面,界面按钮看起来被藏住了,但接口、报表、后台程序或者自开发入口仍然可能绕过去。这类问题在 SAP 项目里非常常见。很多自开发程序一开始只是一个小工具,后来慢慢接入 Fiori、OData、RAP BO、批处理作业、外部系统调用,调用入口越来越多,真正能兜底的地方反而是 ABAP 代码里的授权检查。SAP 的授权体系并不是只靠 PFCG 里维护角色,也不是只靠 SU01 里分配用户角色。角色只是把授权值装进用户主数据,运行时程序必须在关键动作发生前主动问系统一句,当前用户有没有资格做这件事。在 ABAP 里,这句话通常就是AUTHORITY-CHECK。从业务客户订票修改说起场景很清楚,我们要控制业务客户的 booking 修改。这里面至少有两个维度,一个是动作,一个是客户类型。动作由授权字段ACTVT表达。ACTVT是 SAP 里非常经典的活动字段,常见值包括01创建、02修改、03显示、06删除。客户类型由自定义或业务相关授权字段CUSTTYPE表达,示例里B代表 business customer,也就是业务客户。