无需在每次API请求中携带CompanyId完成企业权限校验的方案咨询
方案可行性说明
首先,使用JWT新增自定义声明存储当前激活的CompanyId是比每次请求携带参数更优的实现,完全可以落地:
- 原有方案需要在所有需要企业权限校验的接口中重复定义
public Guid CompanyId {get; set;}参数,不仅增加重复编码工作量,还存在参数漏传、非法篡改的风险,服务端也需要重复做参数和JWT用户权限的关联校验,冗余逻辑多。 - 改用JWT自定义声明实现时,只需要在签发JWT时新增自定义声明(例如命名为
cmp_id)存储当前用户选中的企业ID,服务端通过统一拦截器/中间件直接从JWT中提取该值做权限校验,所有业务接口都不需要再单独接收和处理该参数,大幅减少重复代码。
多企业权限下刷新令牌修改声明的实现
单个用户拥有多企业访问权限的场景下,完全可以通过刷新令牌的方式更新JWT中的声明取值,实现逻辑如下:
- 用户切换企业时,先调用权限校验接口确认该用户具备目标企业的访问权限,校验通过后使用当前有效的refresh_token申请签发新的access_token,将新的企业ID写入新access_token的自定义声明中,可根据自身过期策略选择是否同步签发新的refresh_token。
- 前端替换本地存储的access_token后,后续所有请求自动携带新令牌即可完成企业身份切换,全程不需要用户重新登录,也不需要修改任何业务接口的传参逻辑。
注意事项
- JWT为自包含令牌,签发后无法中途修改内容,因此切换企业必须重新签发access_token,通过刷新令牌更新是成本最低的实现方式。
- 不建议将用户有权限的所有企业列表全部写入JWT payload,避免令牌体积过大,仅存储当前激活的单个
CompanyId即可,全量企业权限列表存储在用户中心/权限服务中,切换企业时做校验即可。 - 若服务架构有网关层,可直接在网关层统一提取JWT中的
CompanyId透传给下游业务服务,业务服务完全不需要感知该参数的处理逻辑,改造侵入性更低。
内容的提问来源于stack exchange,提问作者Kacper Gwiazdowski
相关产品推荐
相关产品推荐

