SAP

使用注解 @requires 给 SAP CAP CDS 模型添

2022-03-21  本文已影响0人  _扫地僧_

使用 @requires 注解不需要提前导入:

输入命令行 cds watch,可以自动扫描并监控 .cds 等格式的文件内容变化:

使用 annotate + entity name + with + 注解实现权限控制:

如果注解出现 typo,编译不报错:

annotate BrowseBooksService with @(requires: 'authenticated-user');
annotate ShopService.Books with @(requires: ['Vendor', 'ProcurementManager']);
annotate ShopService.ReplicationAction with @(requires: 'system-user');

在此示例中,BrowseBooksService 服务对经过身份验证的用户开放,但对匿名用户不开放。 具有 Vendor 或 ProcurementManager 角色的用户可以访问 ShopService.Books 实体。 未绑定操作 ShopService.ReplicationAction 只能由技术用户触发。

当通过 @requires 限制服务访问时,服务的元数据端点(即 /$metadata 以及服务根 /)默认也受到限制。 如果需要公共元数据,可以分别通过 config cds.env.odata.protectMetadata = false (Node.js) 或 cds.security.openMetadataEndpoints = true (Java) 禁用检查。

看个具体的例子,AdminService 只有用户 admin 才能访问:

在 api path 下,只有 admin 用户才能访问 /api/admin:

运行时的 basic Authorization 字段:

使用 ctrl+shift+n 打开隐身窗口,可以避免 Chrome 自动附带 credentials 的问题。

看到下图的 Sign in 按钮,说明权限控制生效了:


cds 模型里的 Authorization 信息,会写入 xs-security.json 文件。

使用如下命令行自动生成:

cds compile service.cds --to xsuaa > xs-security.json.

一个例子文件:

{
  "xsappname": "bookshop", "tenant-mode": "dedicated",
  "scopes": [
    { "name": "$XSAPPNAME.admin", "description": "admin" }
  ],
  "attributes": [
    { "name": "level", "description": "level", "valueType": "s" }
  ],
  "role-templates": [
    { "name": "admin", "scope-references": [ "$XSAPPNAME.admin" ], "description": "generated" }
  ]
}

这个文件的语法在 SAP 官网可以查到。

范围大多是“本地的”; 也就是说,特定于应用程序。 本地范围由应用程序自己的应用程序路由器检查或在应用程序的运行时容器内以编程方式检查。 如果应用程序需要代表当前用户访问其他 SAP HANA XS 服务,则提供的访问令牌需要包含必要的“外部”范围。 应用程序本身不提供外部范围; 它们由应用程序上下文之外的其他来源检查。

在 xs-security.json 文件中,“本地”范围必须以变量 <$XSAPPNAME> 为前缀; 在运行时,该变量被替换为相应的本地应用程序名称。 另一方面,“外部”作用域必须以“外部”应用程序本身的名称作为前缀。

xsappname 的名称在 mta 等 yaml 文件里定义。

上一篇下一篇

猜你喜欢

热点阅读