使用注解 @requires 给 SAP CAP CDS 模型添
使用 @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 官网可以查到。
-
xsappname:xsappname 属性表示系统生成的 OAuth 客户端 ID 的开发人员定义部分。 由于 OAuth 客户端 ID 在给定子帐户(pka“身份区域”)中必须是唯一的,因此必须以保证相应 OAuth 客户端 ID 的唯一性的方式定义 xsappname 属性。在配置其他安全组件时(例如,当 XS 高级管理员使用 SAP HANA XS 高级管理工具从角色模板创建角色时),确保在 xsappname 中定义的名称很重要。
-
scopes:在应用程序安全文件 (xs-security.json) 中,scopes 属性定义了一组适用于应用程序的一个或多个安全范围。 可以定义多个范围; 每个作用域都有一个名称和一个简短的描述。 xs-security.json 文件中定义的范围列表用于授权 XS 应用程序的 OAuth 客户端使用正确的本地和外部范围集; 也就是说,应用程序需要能够响应所有请求的权限。
范围大多是“本地的”; 也就是说,特定于应用程序。 本地范围由应用程序自己的应用程序路由器检查或在应用程序的运行时容器内以编程方式检查。 如果应用程序需要代表当前用户访问其他 SAP HANA XS 服务,则提供的访问令牌需要包含必要的“外部”范围。 应用程序本身不提供外部范围; 它们由应用程序上下文之外的其他来源检查。
在 xs-security.json 文件中,“本地”范围必须以变量 <$XSAPPNAME>
为前缀; 在运行时,该变量被替换为相应的本地应用程序名称。 另一方面,“外部”作用域必须以“外部”应用程序本身的名称作为前缀。
xsappname
的名称在 mta 等 yaml 文件里定义。