有关CDS'requires'语句的更多信息(云应用程序编程模型CAPM)

2020-09-01 21:19发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


在云应用程序编程模型(CAPM)帮助中,有一个诱人的瞥见,即如何按角色控制对服务的访问(在使用单一服务):

服务AdminService @(需要:" admin")

我需要通过Cloud Foundry角色集合来控制对服务的访问。 我可以按照上面的相同方式来做吗? 我是否只是在其中放置角色集合的名称(代替" admin")? 我可以在这里放一个示波器吗?

如果有人可以分享一些文档或示例来说明受支持的内容,我将不胜感激。 即使在注释

谢谢!

cc 克里斯汀·乔治(Christian Georgi) Daniel Hutzel

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


在云应用程序编程模型(CAPM)帮助中,有一个诱人的瞥见,即如何按角色控制对服务的访问(在使用单一服务):

服务AdminService @(需要:" admin")

我需要通过Cloud Foundry角色集合来控制对服务的访问。 我可以按照上面的相同方式来做吗? 我是否只是在其中放置角色集合的名称(代替" admin")? 我可以在这里放一个示波器吗?

如果有人可以分享一些文档或示例来说明受支持的内容,我将不胜感激。 即使在注释

谢谢!

cc 克里斯汀·乔治(Christian Georgi) Daniel Hutzel

付费偷看设置
发送
5条回答
Bunny_CDM
1楼-- · 2020-09-01 22:18

完美答案 Philip MUGGLESTONE

文档以及该功能的正式发布正在进行(采用新格式)...→这是相应指南的(非官方)先行预览,内部可用:

---------

限制

通过向服务,实体或添加 @requires 或 @restrict 注释来限制对服务的访问 >功能,如本例所示:

 service ReviewsService @((需要:"标识用户"){
  /*...*/
 }

 服务CustomerService @((需要:"已验证用户"){
   实体订单@(限制:[
     {授予:['READ','WRITE'],授予:'admin'},
     {grant:'READ',其中:'buyer = $ user'},
   ]){/*...*/}
   实体批准@(限制:[
     {grant:'WRITE',其中:'$ user.level> 2'}
   ]){/*...*/}
 }
 

注释为:

  • @restrict:允许通过记录中赋予的特权数组进行细粒度控制
  • @requires:允许指定必须分配当前用户的一个或多个用户角色(作为单个字符串或字符串数​​组)。

备注:本质上 @requires:只是一个便捷快捷方式,例如:

 @requires:"标识用户" 

…等效于:

 @restrict:[{授予:'*',授予:'identified-user'}] 

...更加简洁和易懂。

特权

@restrict:批注中授予

...并支持以下属性:

  • grant:一个或多个操作(作为字符串或字符串数​​组)
  • to:(可选)(可选)一个或多个用户角色授予特权的人
  • 其中:(可选),进一步限制访问的条件

其中:条件内,请使用以 $ 开头的名称来引用请求属性或JWT令牌中的属性。 示例: $ user $ user.foo $ foo

其中:内的条件允许使用CQL语法。 最初支持 and or (无子选择)。

可以在一个 grant:子句中一起使用 where: to:

where 条件中对实体元素的引用建立了所谓的基于实例的授权。 筛选条件通常将受保护实体的属性与用户或请求属性相关。

用户角色

…可以自由选择,并且对于当前应用程序是本地的。 例如,在上面的示例中,角色名称 admin 反映了书店管理员的假定角色。

注意:如果使用OAuth,则实际上将角色映射到OAuth范围,但是基于CDS的授权故意不使用技术概念,而是使用更接近业务应用程序概念域的用户角色。 这也导致JWT令牌更小。

伪角色

以下是预定义的伪角色:

  • 已认证用户是指通过登录标识的用户
  • identified-user 是通过较弱的机制(例如cookie)来识别的
  • system-user 适用于使用未命名的技术用户呼入的客户端系统
  • 任何是指所有用户,包括未识别的用户

identified-user s是 authenticated-user s的超集。
any 是所有其他用户的超集。

执法

服务提供者框架会自动在通用处理程序中实施限制。 他们通过评估CDS模型中的注释并根据操作来做到这一点……

  • 如果在静态授权的情况下不满足条件,则拒绝传入的请求
  • 在读取查询和基于实例的授权的情况下,向查询的where子句中添加相应的过滤器

或者,您可以在事件处理程序中使用以下方法以编程方式在自定义请求处理程序中实施限制:

执法API

以下是可用于实施实施的API(在Node.js API中提供; swift具有相应的API)-通用实施也使用相同的

  • req.user –查询中 req.user.id 的排序方式
  • req.user.id –访问当前用户的唯一ID,任意字符串
  • req.user.is( –检查用户是否已分配给定角色
  • req.user。 –通过JWT令牌访问与用户相关的属性
  • req.reject(403,...) –由于缺少授权而拒绝请求
  • req.query.where(...) –为查询的where子句添加过滤器

注意:函数 req.user.is(接受当前应用程序的服务模型中引入的角色名称。

愤怒的猪头君
2楼-- · 2020-09-01 22:19

嗨,丹尼尔·赫茨尔 Philip MUGGLESTONE

非常感谢Node.js处理程序中此新功能的预览! 我一直在使用 req.user.is ( )和req.user。 而且非常方便!

在调试请求处理程序时,我遇到了函数

 req.user.has(?)

我尝试执行此功能,但总是收到错误消息:roles.some不是函数。

能否请您阐明此函数的用途以及如何调用?

我也期待正式发布新的CAPM文档。 我希望这会很快发生..:-)

最诚挚的问候,

Ben

暮风yp
3楼-- · 2020-09-01 22:15

嗨,麦克,

尝试作用域名称,但不要使用$ XSAPPNAME。 前缀。

例如,具有以下范围(如xs-security.json中定义):

" scopes":[{
 " name":" $ XSAPPNAME.User",
 " description":"用户"
 },{
 " name":" $ XSAPPNAME.Admin",
 " description":"管理员"
 }],
 

这应该起作用:

 service AdminService @(需要:" Admin")

 service CatalogService @(requires:'User')

您仍然需要定义角色模板和角色集合等,并将角色集合分配给用户,就像在任何Cloud Foundry应用程序中一样。

希望有帮助。

菲利普

Nir深蓝
4楼-- · 2020-09-01 22:07

非常感谢菲利普,我会尝试一下

95年老男孩
5楼-- · 2020-09-01 21:57

Benjamin Krencker

" some"函数是Array上的javascript函数。

https://developer.mozilla。 org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/some

使用has时,必须提供一个范围值数组。 如果有一个范围分配给当前用户,则返回true。

 req.user.has([" user"," admin"])=== req.user.is(" user")||  req.user.is(" admin")

我已经在我的CAPM授权示例中添加了一些代码对此进行测试。

https ://github.com/jowavp/SAP-CAPM-Nodejs-Authorisation-example/blob/master/srv/service.js

kr,

Joachim

一周热门 更多>