【发布时间】:2021-12-07 04:31:41
【问题描述】:
我有一个 CDS 视图并想应用授权检查。
CDS 查看ZCDS_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 表连接起来,从而获得授权的部门
- 使用授权部门过滤我的 CDS 视图的结果。
为此,我这样做了:
创建 CDS ZCDS_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
};
创建 DCL ZDCL_AUTH_PLANT
@MappingRole: true
define role ZDCL_AUTH_PLANT {
grant
select
on
ZCDS_AUTH_PLANT
where
( profit_center ) = aspect pfcg_auth( XXX, PRCTR );
}
更新 CDS ZCDS_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 中做所有事情吗?
【问题讨论】:
-
您在此处询问有关 HANA DB 上的 ABAP CDS 还是本机 HANA CDS?这有很大的不同。在您的问题中,我看到所有视图都在 ABAP CDS 中定义
-
是的,我很糟糕,我会更新标题我谈论 ABAP CDS
-
我宁愿直接在 ZCDS_VIEW 上定义 DCL,而不是在数据模型中定义技术实体。请注意,DCL 也可以包含路径,因此如果您的 ZCDS_VIEW 与 plant 有关联,则可以在 DCL 中执行
( plant.profit_center ) = aspect pfcg_auth( ... )。主要优点是更好的调试工具以及 DCL 与其实际保护的内容之间更好的耦合。