You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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平台专属实现方案
  1. 进入客户端配置页:登录Curity管理控制台,依次进入Profiles -> Token Service -> Clients,找到目标客户端进入编辑界面。
  2. 新增客户端专属Scope映射器:定位到Authorization -> Scope Mappers配置项,新增Script Based Scope Mapper,仅绑定当前目标客户端生效,避免影响其他业务客户端。
  3. 编写角色映射逻辑,参考脚本如下:
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])];
}
  1. 保存配置并发布变更,后续该客户端的授权码流颁发令牌时,会自动根据用户角色注入对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:06:00