头图

笔者之前的文章,介绍了权限控制模块在计算机软件系统里的重要性,以及 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
define role ZAC_SPFLI_AUTH {
    grant 
        select
            on
                Z_C_SPFLI
                    where
                        (Carrid) = aspect pfcg_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 的权限控制机制都已经介绍完毕,希望对大家有所帮助,感谢阅读。


注销
1k 声望1.6k 粉丝

invalid