首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CDS View权限控制原理讲解

本文则选择另一方面,从CDS View权限控制的实现原理出发进行讲解。了解了实现原理,能帮助顾问朋友们在工作中更好地使用CDS View提供的权限控制功能。

还是从一个具体例子出发。创建一个简单的透明表ZORDER,包含订单ID,订单描述,订单类型和创建日期四个字段:

基于该透明表ZORDER创建一个CDS Viewzjerry_order:

注意第三行的注解声明:@AccessControl.authorizationCheck: #CHECK,意思是这个CDS View需要进行权限控制。通过创建CDS权限角色对CDS View进行权限控制。

在SAP Help文档中,有这样一句话:

“If a CDS entity is specified in several access rules of a CDS role, the resulting access conditions are joined using a logical OR”.

翻译成中文:一个CDS权限角色可以绑定到一个CDS View,如果该权限角色指定了多个访问规则,那么最后访问数据库时生效的查询条件,是这些多个访问规则做OR操作后的结果。

如果您还觉得抽象,让我们创建多条权限控制的访问规则,实际测试一下。

首先用事务码SU21创建一个传统的权限控制对象,命名为ZJER_TYPE2。该对象包含一个字段PR_TYPE, 用于控制订单类型的访问,另一个字段ACTVT负责控制对订单能够施加的操作类型,字段的可选值当然是我们熟悉的CRUD(增删改查):

有了权限对象,下面我们就可以创建一个CDS权限角色,通过它对之前创建的CDS View进行权限控制。

在这个CDS权限角色源代码的第7和第9行,我定义了两条访问规则:

在我们写ABAP报表进行权限控制测试之前,还需将上述创建的权限对象和CDS权限角色同我们的测试帐号关联起来。

为此,创建一个新的PFCG角色ZJER_AUTH_TEST3,

字段ACTVT的值赋为01,02, 字段PR_TYPE的值赋为SRVO:

这样,如果该PFCG角色赋给了我的帐号,在前面定义的CDS权限角色的第7行访问规则将会成功,因为该PFCG角色的ACTVT字段的值包含了01。同时,第9行访问规则会失败,因为第9行需要的ACTVT值为03,而PFCG角色里只有01和02。根据SAP帮助文档的定义,最后生效的访问条件是多个访问规则做逻辑OR的结果,因此最终结果为:

"成功" OR "失败" = "成功"。

让我们来做个实际测试验证一下我们的推论。将PFCG角色分配给我的帐号:

使用该帐号执行下列的SQL语句:

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

测试结果:只有一条记录从数据库里读取出来,其订单类型为SRVO。这正是我们期望的结果,因为前面PFCG角色ZJER_AUTH_TEST3里字段PR_TYPE的值定义为SRVO,而不是*, 因此另一条订单类型为OPPT的记录没有权限访问。

这只是我们通过测试观察到的结果,ABAP框架背后到底做了哪些事情,保证只有订单类型为SRVO的记录被读取出来?

我们可以自己研究。使用事务码stauthtrace做一个权限检查的跟踪。

跟踪结果和我们推测的一样,CDS权限角色第7行的访问规则执行成功,而第9行执行失败。做OR操作后最终结果为成功。

使用事务码ST05做一个OPEN SQL的跟踪,在跟踪结果里选择菜单"With Variable Values":

从ST05的跟踪结果我们发现,尽管在OPEN SQL语句里,我们在SELECT操作后面没有指定任何WHERE条件,但是由于执行该读操作的账号分配的PFCG角色里的字段PR_TYPE的值为SRVO, 因此ABAP框架在SQL执行时会悄悄加上一个ORDER_TYPE = SRVO的WHERE条件:

这个行为在SAP帮助文档中提到:

When Open SQL is used to access a CDS entity and an access rule is defined in a role for this entity, the access conditions are evaluated implicitly and their selection restricted so that in SELECT reads, the access condition is added to the selection condition of the statement passed from the database interface to the database using a logical “and”.

大意是:当使用OPEN SQL访问CDS View时,如果这个CDS View被一个CDS权限角色控制,该权限角色上定义了访问条件,那么最终在数据库层面执行的查询操作,查询条件为OPEN SQL里本身书写的WHERE条件再加上CDS权限角色里定义的条件,两个条件的关系是AND。CDS权限角色访问条件的添加是由ABAP数据库接口完成的。

这就是CDS View权限控制的实现原理。大家在实际工作中,当遇到CDS View权限控制没有按照自己期望的场景工作时,可以使用本文介绍的事务码stauthtrace和st05对权限控制的运行时进行跟踪,通过结果定位出问题所在。

希望本文对大家的CDS View开发有所帮助。感谢阅读。

往期精华

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201201A012XR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券