网易首页 > 网易号 > 正文 申请入驻

SAP把权限系统拆了3层,开发者发现后集体懵圈

0
分享至


一套权限系统能有多少种写法?SAP CAP(云应用编程模型)的答案是:至少5种,而且它们还在互相打架。

这不是夸张。当你用CAP Java开发企业应用时,XSUAA(SAP扩展服务用户账户与认证)负责发令牌,CDS注解负责声明权限,@restrict负责细粒度控制,代码里还要手动检查角色——四层防护网,每层都有自己的语法和陷阱。

更麻烦的是,这套系统是为多租户设计的。你的代码跑在SAP BTP上,可能同时服务几十个企业客户,每个客户的用户库、角色体系、数据隔离策略完全不同。

开发者社区有个黑色幽默:在CAP里实现"用户A只能看自己部门的数据",需要跨越认证、授权、实例三个层面,配置文件的行数比业务代码还多。

01 | 令牌旅行:一次请求要换几次身份证

先看一张流程图。浏览器发起请求时,CAP Java本身不直接面对用户,中间隔着Approuter和XSUAA两道关卡。

用户点击应用链接,Approuter直接把人踢到登录页。XSUAA验完用户名密码,签发一枚JWT(JSON Web Token,一种紧凑的令牌格式)。这枚令牌里打包了用户ID、邮箱、角色列表、自定义属性,还有最关键的租户标识zid。

用户带着令牌回头找Approuter,Approuter再转发给CAP Java服务。CAP Java做的第一件事不是执行业务逻辑,而是拆令牌——验签名、取角色、比对权限注解。

整个过程像机场安检:XSUAA是护照签发处,Approuter是边检柜台,CAP Java是最终的目的地海关。每层都要查证件,但查的重点不同。

JWT的载荷结构暴露了SAP的企业级思维。scope字段用"应用名!租户ID.角色名"的格式,比如"my-app!t12345.Viewer",天然支持多租户场景。xs.user.attributes则预留了扩展槽,Country、CostCenter这类属性可以参与后续的权限判断。

开发阶段有个捷径。在application.yaml里开启mock模式,能凭空造出alice、bob这类测试用户,配好密码、角色、属性。上线前切回jwt模式,同一套代码无缝对接真实XSUAA。

02 | 声明式权限:在数据模型上贴封条

CAP的野心是让权限像数据库约束一样声明化。你在CDS文件里写注解,运行时自动生效,不用在业务代码里到处if-else。

最基础的注解是@requires。贴在实体或服务上,直接限定谁能访问。比如@requires: 'Admin'意味着没有Admin角色的用户,连实体定义都看不到。

但企业场景很少这么粗暴。同一个实体,管理员能删,普通员工只能看,审批流里的角色还能改特定字段——这种差异用@restrict表达。

@restrict的语法像一门微型编程语言。grant指定允许的操作,to限定角色,where附加数据过滤条件。更复杂的是,条件里可以引用JWT中的属性,比如where: Country = $user.Country。

这就引出了CAP权限系统的第一个深坑:实例级授权。用户不是"能不能访问Books实体",而是"能不能访问Books里Country=DE的那部分记录"。


实现机制依赖CDS的查询改写。用户请求底层数据时,CAP自动把@restrict里的where条件注入SQL。开发者写的是声明式规则,运行时变成数据库层面的行级过滤。

但自动改写有边界。跨实体的复杂权限、基于聚合结果的动态判断、或者需要调用外部服务的场景,声明式语法覆盖不到。这时要退回编程式安全——在Java代码里手动检查用户上下文。

03 | 多租户的暗面:你的代码在替谁打工

单租户应用里,用户角色是静态配置。多租户环境下,每个订阅客户可能有自己的IdP(身份提供方),同一套代码要同时理解微软Entra ID、SAP IAS、甚至企业自建的LDAP。

XSUAA的zid字段就是为此设计的。每个租户有独立的zone ID,JWT里带着这个标识,CAP Java据此路由到对应的租户上下文。

但隔离不只是数据层面的。不同租户的用户可能同名同邮箱,角色命名冲突更是常态。CAP的解决方案是"应用名!租户ID"的命名空间隔离,scope字段里的t12345就是租户标识。

测试多租户权限尤其痛苦。mock用户只能模拟单一租户场景,要验证真实的租户隔离,必须部署到BTP环境,配置真实的XSUAA实例和订阅关系。

社区里流传着一个调试技巧:在CAP服务里打印SecurityContext,能看到当前请求解析出的全部用户属性。但生产环境开这个等同于泄露敏感信息,只能短暂用于故障排查。

04 | 当声明式不够用:代码里的逃生舱

CDS注解能覆盖80%的权限场景,剩下20%是硬骨头。比如"用户只能审批金额小于自己职级的订单",规则依赖运行时数据比对,写不进静态注解。

CAP Java提供了SecurityContext接口,代码里随时能取当前用户、角色、属性。配合Spring Security的表达式,能在方法级别做细粒度控制。

但编程式权限有个悖论:它打破了CAP"模型即文档"的愿景。注解一眼能看到权限策略,散落在Java代码里的检查逻辑需要翻遍项目才能拼凑全貌。

更隐蔽的风险是测试。声明式权限可以单元测试验证,编程式逻辑需要模拟完整的安全上下文。CAP的mock用户机制在这里派上用场,但配置复杂度直线上升。

有个折中方案:把复杂权限封装成CDS自定义函数,既保留声明式的可读性,又能嵌入任意业务逻辑。代价是多一层抽象,调试时要同时看CDS定义和Java实现。

回到开头的问题。CAP的权限系统为什么设计得这么"碎"?

答案藏在SAP的客户画像里。这套框架要同时服务快速迭代的内部应用、严格合规的金融行业客户、以及需要深度定制的大型企业。每层抽象都对应一类场景,组合起来就成了开发者眼中的"迷宫"。

社区里最近有个讨论:有人把CAP的权限配置导出成可视化图谱,发现中等规模项目的权限规则能画出200多个节点。维护者自嘲说,这比业务数据模型还复杂——但审计人员很喜欢,因为每条规定都能追溯到具体注解或代码行。

你的项目权限规则有多少条?有没有算过维护成本占开发时间的比例?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
梅西起诉Temu、Shein等平台中国卖家,纽约法院已受理

梅西起诉Temu、Shein等平台中国卖家,纽约法院已受理

情感大头说说
2026-03-28 08:20:47
张雪峰:如果你不好好学习,一旦掉入社会底层,和一群没有素质的人混在一起.....

张雪峰:如果你不好好学习,一旦掉入社会底层,和一群没有素质的人混在一起.....

山东教育
2026-01-27 11:38:18
湖南省高院明确定性“错判”的刑案,长沙司法系统为何死扛到底?

湖南省高院明确定性“错判”的刑案,长沙司法系统为何死扛到底?

塔子山评说
2026-03-28 14:43:49
打疯了!骑士领先35分打崩劲旅:全场狂欢庆祝,哈登14分9助

打疯了!骑士领先35分打崩劲旅:全场狂欢庆祝,哈登14分9助

体坛小李
2026-03-28 08:53:47
“雪山救狐狸”全网传播量破50亿,成本仅40元,主创只想卖酱板鸭

“雪山救狐狸”全网传播量破50亿,成本仅40元,主创只想卖酱板鸭

九方鱼论
2026-03-27 10:10:51
被成龙“泡过”的三位女星,个个性感迷人,其中一位火遍全国

被成龙“泡过”的三位女星,个个性感迷人,其中一位火遍全国

阿凫爱吐槽
2026-03-23 14:07:43
101枚导弹砸向美国航母:伊朗打出了开战以来最强一拳

101枚导弹砸向美国航母:伊朗打出了开战以来最强一拳

魔神主的仇恨
2026-03-28 13:50:34
39万亿美债曝光,美联储通知全球,中国分批运回金条,川普急表态

39万亿美债曝光,美联储通知全球,中国分批运回金条,川普急表态

亿通电子游戏
2026-03-27 17:57:19
日媒:美“新型”稀土技术,可高效清洁回收稀土,或动摇稀土霸权

日媒:美“新型”稀土技术,可高效清洁回收稀土,或动摇稀土霸权

爆角追踪
2026-03-27 14:43:47
伊朗官媒发布《为众人复仇》AI短片:一枚伊朗导弹在哈梅内伊等人注视下,精准炸毁幻化成羊头恶魔的美国自由女神像

伊朗官媒发布《为众人复仇》AI短片:一枚伊朗导弹在哈梅内伊等人注视下,精准炸毁幻化成羊头恶魔的美国自由女神像

大象新闻
2026-03-26 09:45:03
意天空:那不勒斯告知卢卡库,3月31日前不归队就开除他

意天空:那不勒斯告知卢卡库,3月31日前不归队就开除他

懂球帝
2026-03-27 23:22:07
升温后才发现:没人穿卫裤、弯刀裤,满街都是这3种春裤,好时髦

升温后才发现:没人穿卫裤、弯刀裤,满街都是这3种春裤,好时髦

冒泡泡的鱼儿
2026-03-26 09:42:20
巴基斯坦:将就中东局势举行四国外长会议

巴基斯坦:将就中东局势举行四国外长会议

财联社
2026-03-28 09:33:05
成都警方通报:自导自演网约车纠纷骂乘客,李某国(男,37岁,中江县人)被罚

成都警方通报:自导自演网约车纠纷骂乘客,李某国(男,37岁,中江县人)被罚

封面新闻
2026-03-28 00:57:15
荷兰红灯区:在这里没有做不到,只有你想不到的大尺度

荷兰红灯区:在这里没有做不到,只有你想不到的大尺度

番外行
2026-03-21 13:03:00
这是目前为止,我见过腰最细的女生,没有之一

这是目前为止,我见过腰最细的女生,没有之一

草莓解说体育
2026-03-03 19:15:05
英国向全球宣告,中国风力涡轮机“高度危险”,禁止采购中国风电

英国向全球宣告,中国风力涡轮机“高度危险”,禁止采购中国风电

书纪文谭
2026-03-27 17:47:25
21辆坦克覆灭,国防部大楼被炸!伊朗盟友真猛,英媒惊呼:拦不住

21辆坦克覆灭,国防部大楼被炸!伊朗盟友真猛,英媒惊呼:拦不住

近史阁
2026-03-28 11:00:59
伊媒:一架美战斗机被击中,在科威特坠落!伊朗喊话特朗普:你被解雇了!我驻以使馆再提醒:中国公民摒弃侥幸心理,尽快回国或转移撤离

伊媒:一架美战斗机被击中,在科威特坠落!伊朗喊话特朗普:你被解雇了!我驻以使馆再提醒:中国公民摒弃侥幸心理,尽快回国或转移撤离

每日经济新闻
2026-03-23 16:03:07
一夜输1亿,一瓶酒50万,2亿豪车买来当玩具,父子败光百亿家产!

一夜输1亿,一瓶酒50万,2亿豪车买来当玩具,父子败光百亿家产!

历史伟人录
2026-03-13 18:28:07
2026-03-28 16:03:00
Ping值焦虑
Ping值焦虑
有态度网友ytd
299文章数 2关注度
往期回顾 全部

科技要闻

遭中国学界"拉黑"后,这家AI顶会低头道歉

头条要闻

特朗普:北约没支持美打击伊朗 美国以后也不会帮北约

头条要闻

特朗普:北约没支持美打击伊朗 美国以后也不会帮北约

体育要闻

“我是全家最差劲的运动员”

娱乐要闻

王一博改名上热搜!个人时代正式开启!

财经要闻

我在小吃培训机构学习“科技与狠活”

汽车要闻

置换补贴价4.28万起 第五代宏光MINIEV正式上市

态度原创

艺术
亲子
旅游
本地
公开课

艺术要闻

细腻优雅的花卉静物画 | Henrietta Smith

亲子要闻

为什么说人这辈子一定要生个孩子?

旅游要闻

春夏秋冬皆可游!济南将打造四季可游、全域皆景的文旅体验

本地新闻

在潍坊待了三天,没遇到一个“潍坊人”

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版