在Curity中如何根据用户角色为指定客户端分配对应scope
前提条件
- 某OAuth客户端采用Authorization code flow,供网站从反向代理后的API获取资源
- Curity的SCIM 2.0 User Schema的roles字段中定义了admin、customer两类用户角色
- 已基于account-manager-claims-provider返回的roles[]字段配置了自定义声明roles
- 现有product_read、product_write两个scope
需求目标
针对上述单个客户端实现按角色分配scope:customer角色用户获得product_read scope,admin角色用户获得product_write scope。
Curity平台专属实现方案
- 进入客户端配置页:登录Curity管理控制台,依次进入
Profiles -> Token Service -> Clients,找到目标客户端进入编辑界面。 - 新增客户端专属Scope映射器:定位到
Authorization -> Scope Mappers配置项,新增Script Based Scope Mapper,仅绑定当前目标客户端生效,避免影响其他业务客户端。 - 编写角色映射逻辑,参考脚本如下:
function mapScopes(context) { // 初始化待授予的scope列表 const grantedScopes = []; // 从上下文中获取用户已返回的roles自定义声明 const userRoles = context.claims?.roles || []; // 按角色匹配对应scope if (userRoles.includes('customer')) { grantedScopes.push('product_read'); } if (userRoles.includes('admin')) { grantedScopes.push('product_write'); } // 可选逻辑:合并用户主动请求的合法基础scope(如openid、profile等) const allowedRequestedScopes = context.requestedScopes.filter(scope => { return ['openid', 'profile', ...grantedScopes].includes(scope); }); // 去重后返回最终授予的scope列表 return [...new Set([...allowedRequestedScopes, ...grantedScopes])]; }
- 保存配置并发布变更,后续该客户端的授权码流颁发令牌时,会自动根据用户角色注入对应scope,无需用户主动请求角色对应的业务scope即可生效。
RBAC模式下Scope适配与API全链路安全最佳实践
- 权限来源唯一可信:反向代理/API网关校验令牌时,禁止信任客户端自主携带的角色、scope请求头,所有权限判断必须以令牌内Curity签发的官方声明为准。
- 最小权限兜底规则:用户未匹配到任何有效角色时,默认不授予任何业务类scope,仅保留openid等基础身份类scope,避免未授权访问。
- 令牌有效期分层控制:access_token有效期控制在15分钟以内,refresh_token可根据业务需求设置为几天到几周不等,用户角色变更后下次刷新令牌时自动同步最新scope权限,降低权限变更滞后风险。
- 双层权限校验机制:网关完成令牌有效性、scope基础校验后,业务API内部需再次校验当前请求接口所需权限与令牌内scope是否匹配,避免网关配置疏漏导致越权。
- 权限变更实时同步:用户角色在SCIM侧更新后,可主动调用Curity令牌撤销接口作废该用户所有生效令牌,强制用户重新登录获取最新权限的令牌,避免权限回收不及时的安全隐患。
内容的提问来源于stack exchange,提问作者Nickola
相关产品推荐
相关产品推荐

