如何在AWS Cognito中结合Serverless Lambda实现多租户RBAC权限控制
核心结论
完全可以靠Cognito实现你要的多组织/多订阅方场景的RBAC权限控制,根本不用推翻你现在已经跑稳的那套单组织授权流程,只要在现有链路上补几个组织维度的适配逻辑,就能直接兼容带{org_id}路径参数的接口权限校验。
为啥现有主流单组织方案撑不住多组织场景
你现在看到的大部分技术教程里的Cognito+Serverless授权方案,核心逻辑是把Cognito的用户组直接映射成全局IAM策略,这类逻辑天然只能识别“当前用户属于哪个全局权限组”,根本不会关联用户和具体组织的从属关系——哪怕是A组织的管理员,在这套逻辑下也能无限制访问所有组织的员工列表,完全做不到租户级的权限隔离。
落地多组织权限的具体改造步骤
- 把组织维度的身份信息绑到Cognito的用户身份上
直接在Cognito用户池里加自定义属性,用来存用户和组织的从属关系:- 如果一个用户只属于单个组织,就加
custom:org_id、custom:org_role两个字段,分别存用户所属的组织ID、用户在这个组织里的RBAC角色 - 如果一个用户同时属于多个组织,就把属性改成数组格式,用JSON序列化字符串存映射关系,比如
custom:member_orgs的取值格式为[{"org_id":"org_001","role":"admin"},{"org_id":"org_002","role":"viewer"}]
配置Cognito在给用户发访问令牌、身份令牌的时候,自动把这些自定义属性塞进令牌的Claims里,后面做授权校验的时候,直接从令牌里提信息就行,不用临时绕去查业务库,链路延迟基本不会涨。
- 如果一个用户只属于单个组织,就加
- 换API网关的授权逻辑,接住路径里的org_id校验
原来靠Cognito内置授权器挂IAM权限的路子,因为读不到API运行时的实际{org_id}参数,根本做不了租户校验,换成Lambda自定义请求授权器就好:- 授权器先校验令牌是不是合法的
- 直接从请求的路径参数里提取当前要访问的
org_id值 - 从令牌的Claims里把用户关联的组织列表捞出来,先判断这个用户到底有没有权限访问当前路径下的这个组织
- 再看用户在当前组织里的角色,够不够调用这个接口的权限,最后生成临时的IAM策略给下游的Lambda用,和你现在用的Serverless Lambda调用链路是完全兼容的,不用动Lambda本身的业务代码。
- 保留存量接口的兼容性
原来那些不带组织路径参数的老接口(比如http://12.in/list/employees),只要在授权器里加个兜底逻辑:如果路径里没找到org_id参数,就按原来的全局默认组织的权限流程走,完全不会把已经上线的业务搞挂。
几个实际踩过的坑
- 别死磕纯IAM策略做多组织权限:IAM只能匹配写死的API路径模板,拿不到运行时的
{org_id}实际值,根本判断不了这个路径参数对应的组织是不是用户能访问的租户,这也是老方案只能做单组织场景的核心原因。 - 所有组织和用户的绑定关系,必须从Cognito签发的令牌里提,千万别信前端传的org_id参数,不然很容易被人改个路径参数就越权拿到别的组织的数据。
内容的提问来源于stack exchange,提问作者Thirumal
相关产品推荐
相关产品推荐

