SAP ABAP CDS 查看/DCL 检查授权

Posted

技术标签:

【中文标题】SAP ABAP CDS 查看/DCL 检查授权【英文标题】:SAP ABAP CDS View / DCL check authorization 【发布时间】: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 与其实际保护的内容之间更好的耦合。 【参考方案1】:

这是一个好习惯吗?

DCL 是对 ABAP CDS 视图实施授权检查的标准方法,所以是的,使用它是一种很好的做法。

这包含在Access Control for CDS Entities 和Creating DCL Sources 的官方文档中

您是否看到更相关的替代方案?

使用 DCL 文件是否无法满足您的要求?如果它正常工作,您已经在使用正确的方法来实施身份验证检查,因此不需要其他解决方案

我们应该在 DCL 中做所有事情吗?

如果一切都意味着完整的授权检查,那么是的。 当然,除了检查 PCFG 对象(例如 GDPR 限制)之外,您还可以在 DCL 中拥有更复杂的逻辑,但它似乎不适用于您的场景

【讨论】:

以上是关于SAP ABAP CDS 查看/DCL 检查授权的主要内容,如果未能解决你的问题,请参考以下文章

SAP ABAP CDS view里的注解在ABAP后台是如何被解析的?

SAP ABAP CDS view 里 INNER JOIN 和 Association 的区别

SAP ABAP CDS view 里 INNER JOIN 和 Association 的区别

SAP NetWeaver ABAP 服务器的数据库表database table暴露为CDS View

SAP NetWeaver ABAP 服务器的数据库表database table暴露为CDS View

SAP NetWeaver ABAP 服务器的数据库表database table暴露为CDS View