笔者之前的文章,介绍了权限控制模块在计算机软件系统里的重要性,以及 ABAP 系统权限控制的原理。
上面这篇文章,最重要的两个概念是 ABAP Authorization Object 和 PFCG Role.
在 SAP 旗舰级产品 S/4HANA 里,Virtual Data Model(VDM)是极其重要的建模工具。
VDM 的重要组成部分就是 CDS View.
- SAP S/4HANA Virtual Data Model 介绍系列之一:CDS View 的详细分类
- SAP S/4HANA Virtual Data Model 介绍系列之二:Basic Interface View
- SAP S/4HANA VDM 介绍系列之三:Basic Restricted Reuse Views
- SAP S/4HANA Virtual Data Model(VDM) 概念介绍
那么,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 的权限控制机制都已经介绍完毕,希望对大家有所帮助,感谢阅读。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。