我有一个CDS视图,并且想要应用授权检查。
CDS ViewZCDS_VIEW
@AbapCatalog.sqlViewName: 'ZCDS_VIEW'
@VDM.viewType: #BASIC
@AccessControl.authorizationCheck: #CHECK
define view ZCDS_VIEW
as select distinct from vbak
inner join vbap on vbap.vbeln = vbak.vbeln // At least 1 item
[...]
{
key vbak.vbeln,
vbak.ktext,
[...]
}
where
[...].
我担心的是,控制授权的方法需要在不同的表中进行检查,而不仅仅是在CDS视图中对字段进行授权检查。的确,我必须:
- 查看指定表利润中心的授权ZT1
- 将ZT1表的条目与ZT2表连接起来,ZT2表给出了授权的分区
- 使用授权的分区筛选我的CDS视图的结果。
我是这样做的:
创建cdZCDS_AUTH_PLANT
@AbapCatalog.sqlViewName: 'ZCDS_AUTH_PLANT'
@VDM.viewType: #BASIC
@AccessControl.authorizationCheck: #CHECK
define view ZCDS_AUTH_PLANT
as select distinct from zt1
inner join zt2 on zt2.bu = zt1.bu
{
zt1.prctr as profit_center,
zt2.bukrs as company_code,
zT2.werks as plant_code
};
Create DCLZDCL_AUTH_PLANT
@MappingRole: true
define role ZDCL_AUTH_PLANT {
grant
select
on
ZCDS_AUTH_PLANT
where
( profit_center ) = aspect pfcg_auth( XXX, PRCTR );
}
更新CDSZCDS_VIEW
增加ZCDSC4_AUTH_PLANT
的连接条件,使其具有授权的分区。
@AbapCatalog.sqlViewName: 'ZCDS_VIEW'
@VDM.viewType: #BASIC
@AccessControl.authorizationCheck: #CHECK
define view ZCDS_VIEW
as select distinct from vbak
inner join ZCDSC4_AUTH_PLANT on ZCDSC4_AUTH_PLANT.plant_code = vbap.werks // At least 1 item matching division
[...]
{
key vbak.vbeln,
vbak.ktext,
[...]
}
where
[...].
我想知道:
- 这是一个好的做法吗?
- 你看到更相关的替代方案了吗? 我们应该在DCL中做所有的事情吗?
这是一个好的做法吗?
DCL是为ABAP CDS视图实现授权检查的标准方法,所以使用它是一个很好的实践。
这包含在官方文档中,这里是CDS实体的访问控制,这里是创建DCL源
你看到更相关的替代方案了吗?
使用DCL文件不符合您的要求吗?如果它正在工作,那么您已经使用了正确的方法来实现认证检查,因此不需要其他解决方案
我们应该在DCL中做所有事情吗?
如果一切都意味着完整的授权检查,那么是。当然,您也可以在DCL中拥有比仅检查PCFG对象(例如GDPR限制)更复杂的逻辑,但它似乎不适用于您的场景