使用注解|使用注解 @requires 给 SAP CAP CDS 模型添加权限控制
【使用注解|使用注解 @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 = https://www.it610.com/article/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 客户端使用正确的本地和外部范围集; 也就是说,应用程序需要能够响应所有请求的权限。
在 xs-security.json 文件中,“本地”范围必须以变量
<$XSAPPNAME>
为前缀; 在运行时,该变量被替换为相应的本地应用程序名称。 另一方面,“外部”作用域必须以“外部”应用程序本身的名称作为前缀。xsappname
的名称在 mta 等 yaml 文件里定义。
文章图片
推荐阅读
- Spring|Spring Boot 应用使用 application.yml 和 application.properties 的区别
- Content|Content Security Policy 学习笔记之三(CSP 指令的使用方式)
- 如何在|如何在 SAP BTP Java 应用里使用 SAP HANA 数据库
- 一个实际的例子学习|一个实际的例子学习 SAP BTP Java 应用的 @Before 注解使用方式
- java常用Lambda表达式使用场景源码示例
- Java十分钟精通接口的使用与原理
- 前端工程化(使用|前端工程化:使用 shelljs 生成 yapi 接口文件)
- 使用JPA+querydsl如何实现多条件动态查询
- 使用SpringSecurity设置角色和权限的注意点
- 记录使用elementUI设置主题遇到的坑