SAP CDS view权限控制实现原理介绍
Part1 – how to test odata service generated by CDS view
Part2 – what objects are automatically generated after you activate one CDS view
Part3 – how is view source in Eclipse converted to ABAP view in the backend
Part4 – how does annotation @OData.publish work
Part5 – how to create CDS view which supports navigation in OData service
Part6 – consume table function in CDS view
Part7 – unveil the secret of @ObjectModel.readOnly
Part8 – my summary of different approaches for annotation declaration and generation
Part9 – cube view and query view
Part10 – How does CDS view key user extensibility work in S4/HANA
Part11 – CDS view test double framework
Part12 – CDS view source code count tool
Part13 – this blog
Part14 – CDS view performance analysis using PlanViz in HANA studio
There are already lots of blogs in community talking about CDS authorization concept, here I just blog what is so far not mentioned in those blogs.
For demonstration purpose I create a very simple database table ZORDER with two entries:
And a CDS view on top of it:
@AbapCatalog.sqlViewName: 'zvorder'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Order for authorization POC'
define view zjerry_order as select from zorder {
key order_id,
order_text,
order_type,
post_date
}
In SAP help, it is documented that “If a CDS entity is specified in several access rules of a CDS role, the resulting access conditions are joined using a logical OR”.
And I create a simple authorization object ZJER_TYPE2 in tcode SU21 which contains field PR_TYPE for order type and ACTVT field with following settings:
And then create an Access Control object:
@EndUserText.label: 'Order DCL POC'
@MappingRole: true
define role Zjerry_Order_Dcl {
grant select on zjerry_order
where ( order_type) =
aspect pfcg_auth( ZJER_TYPE2, pr_type, ACTVT = '01' )
or ( order_type) =
aspect pfcg_auth( ZJER_TYPE2, pr_type, ACTVT = '03' );
}
Create a new PFCG role ZJER_AUTH_TEST3 with ACTVT = 01,02 and PR_TYPE = SRVO:
I use this combination to ensure that the statement before the OR operator will pass ( aspect pfcg_auth( ZJER_TYPE2, pr_type, ACTVT = ’01’ ) ) while the statement after OR will fail ( aspect pfcg_auth( ZJER_TYPE2, pr_type, ACTVT = ’03’ ).
And then assign this PFCG role to my user:
This means from semantic perspective that “it is expected that user WANGJER can only have access to order with process type SRVO“.
Now all preparation is ready. Execute this simple SQL:
SELECT * INTO TABLE @DATA(lt_data) FROM zjerry_order.
Only 1 record with type SRVO is returned, working as expected. But why? How does it work?
Use tcode stauthtrace to perform a trace:
The trace result shows that the evaluation for first statement before OR is done successfully, and the statement after Or fails. According to SAP help, the whole result is still true( true OR false = true ).
What magic thing has happened when the OPEN SQL is executed? Why the record with order type OPPT is automatically filtered out?
Perform a SQL trace with tcode ST05, display execution plan via menu below:
You can find there is a fragment of WHERE statement automatically added. The value for ORDER_TYPE comes from the value of authorization object field PR_TYPE which is mapped to CDS view field ORDER_TYPE in my DCL object.
This behavior is consistent with what is documented in SAP help:
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”.
Two DCL objects defined on the same CDS view
Again the SAP help said “If a CDS entity is specified in multiple CDS roles, the resulting access conditions are joined using a logical OR”.
Let’s create a new PFCG role ZJER_AUTH_TEST4 which only grants displayauthorization on order type OPPT.
@EndUserText.label: 'display authorization on OPPT'
@MappingRole: true
define role Zjerry_Order_Dcl2 {
grant select on zjerry_order
where ( order_type) =
aspect pfcg_auth( ZJER_TYPE2, pr_type, ACTVT = '03');
}
Execute the SQL once again under trace mode:
Still one record with type SRVO is returned.
The corresponding automatically appended where statement: since the PFCF role ZJER_AUTH_TEST4 is NOT assigned to my user WANGJER, so when the open SQL is performed on the view, NO corresponding where statement for order type OPPT defined in that PFCG role is appended.
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关文章
- SAP UI5 Table 控件数据进行 Excel 导出时如何进行格式控制
- 一个 SAP 开发工程师的成长史 - 关于信息素养和数字化资产的思考
- SAP UI5 Nav container - how the inner control is added
- 如何在SAP里创建configurable material物料主数据
- SAP CRM呼叫中心toolbar的cancel按钮会导致session清理
- SAP Business Application Studio的权限控制
- SAP Netweaver和Hybris Commerce启动后执行的默认操作
- SAP CRM页面assignment block动态显示与否的控制逻辑
- SAP CRM呼叫中心点了interact按钮后的处理逻辑
- SAP Spartacus breakpoint服务中platformID的注入逻辑
- 如何通过Restful API的方式读取SAP Commerce Cloud的Product图片
- SAP事务码MM02里的字段属性控制
- 如何用 SAP BTP 平台上的图形建模器创建一个 OData 服务
- SAP 电商云和 Customer Data Cloud(CDC) 的登录集成过程中的一些问题分析
- SAP CAP 项目 cds watch 生成的 index.html 的模板位置和权限控制
- SAP Spartacus B2B 页面 Disable 按钮的显示原理
- SAP Spartacus 3.0 加载homepage的逻辑