从一个实际的例子出发,介绍 SAP ABAP CDS View 的权限控制实现原理

文摘   2024-08-23 18:18   北京  

笔者之前的文章,介绍了权限控制模块在计算机软件系统里的重要性,以及 ABAP 系统权限控制的原理。

SAP ABAP 权限控制的入门级介绍

上面这篇文章,最重要的两个概念是 ABAP Authorization Object 和 PFCG Role.

在 SAP 旗舰级产品 S/4HANA 里,Virtual Data Model(VDM)是极其重要的建模工具。

VDM 的重要组成部分就是 CDS View.

那么,CDS View 是否也存在类似的权限控制机制呢?当然有。

本文通过一个实际的例子来聊聊这个话题。

在阅读本文之前,请大家先重温前一篇文章 SAP ABAP 权限控制的入门级介绍的内容,以获得了解 CDS View 权限控制的前置知识。

我们从一个实际的例子出发,引出对 CDS View 权限控制的讨论。

基于数据库表 SPFLI 创建一个简单的 CDS View,取名为 Z_C_SPFLI.

注解 @AccessControl.authorizationCheck 负责定义 CDS View 权限控制策略,其值 #CHECK 包含两层含义:

  • 在开发时如果该视图没有维护对应的权限控制对象,则抛出语法检查的警告信息

  • 在运行时当该视图被读取时,执行权限控制逻辑

如下图所示,刚刚创建好的 CDS View,还没为其创建权限控制对象,所以收到一条警告信息:

No access control for entity Z_C_SPFLI.

此时使用 ABAP OPEN SQL 或者直接在 ABAP Development Tool 里预览该视图,能够显示 SPFLI 数据库表的全部内容,因为此时没有定义任何的权限控制逻辑。

在 ABAP Development Tool 里右键新建一个权限控制对象。

在创建向导里,选择 defineRoleWithPFCGAspect 的模版。这里能看到 ABAP CDS View 的权限控制对象,其定义手段是多种多样的。

本文我们选择的模版是最简单的定义 CDS View 权限控制手段之一,能够重用前一篇文章创建好的 ABAP Authorization Object.

基于该模版生成权限控制对象的源代码如下。我们将括号内模版占位符替换成实际值即可。

最终完成的源代码:

@EndUserText.label:'Auth control for view Z_C_SPFLI'@MappingRole:true
definerole ZAC_SPFLI_AUTH {   grant       select           on               Z_C_SPFLI                   where                       (Carrid=aspectpfcg_auth(zspfli_aut,                         zspfli_ctr,                         actvt ='03');}

上述代码中,zspfli_aut 是前一篇文章创建好的 Authorization Object 名称,zspfli_ctr 是该授权对象的 Authorization Field, actvt 字段的值为 03,代表读取操作。

这段代码的语义是,当且仅当试图消费 Z_C_SPFLI 的用户,其用户角色包含了源代码中指定的授权对象 zspfli_aut 时,ABAP 框架才允许该用户,按照 Authorization Object 指定的读取限制条件,进行数据的读取操作。

使用 aspect pfcg_auth 关键字定义 CDS View 的访问控制对象,优点是能够允许开发者利用已有的权限控制机制,从而减少新增和管理复杂权限结构的工作。

大家还记得前一篇文章我们创建的 PFCG Role 吗?里面定义的权限访问规则是,只允许用户显示 Airline Code 为 SQ 的航班信息,如下图所示:

在 ABAP Development Tool 里激活这个 Access Control 对象之后,原本 CDS View 的语法警告消息消失了。取而代之的是另一条提示消息:

The entity Z_C_SPFLI is used in DCL document ZAC_SPFLI_AUTH.

意思是如今视图 Z_C_SPFLI 的权限控制,已经被 ZAC_SPFLI_AUTH 接管了。

此时我们重新预览 CDS View,发现权限控制对象果然起作用了:只有 4 条数据被读取出来,其 Carrid 字段均为 SQ,正好是 PFCG Role 里定义的条件。

我们可以编写一个只包含一行 OPEN SQL 的 ABAP 报表:

SELECT * INTO TABLE @DATA(lt_data) FROM z_c_spfli.

然后使用 ST05 事务码分析这条 SQL 语句的执行过程。选中 SQL 语句,选择菜单 Edit->Display Statement 即可。

ST05 里显示的信息表明,CDS View 的权限控制机制,运行时没有什么高深的技术,就是把 PFCG Role 中 Authorization Object 声明的条件,展开成了 OPEN SQL Where 条件的一部分。

下图是 PFCG Role 里 Authorization Object 包含的读取限制条件:Carrid(Airline Code) = SQ

这个条件最终成为 WHERE 语句里 AND 操作符后的一部分:CARRID = SQ.

同时我们能观察到一条注释:

CDS access control applied. 

这提示开发人员,这张视图读取时,其分配的访问控制逻辑已经生效了。

然后我换了另一个没有分配对应 PFCG Role 的用户,重新直接报表,发现一条数据都读取不出来了。

原因是,ABAP 运行时在 WHERE 条件后,把用户没有分配 PFCG Role 这种情况,展开成 CARRID <> CARRID, 所以导致 0 条数据读取成功。

至此传统 ABAP 和 CDS View 的权限控制机制都已经介绍完毕,希望对大家有所帮助,感谢阅读。

码农干货铺
永远要保持一种无论何时何地都逼着自己更努力更优秀来享受更好生活的学习状态
 最新文章