如何基于AWS构建支持用户个性化内容访问的简单Web应用
AWS笔记应用行级权限控制(仅允许用户访问自有笔记)实现方案
核心逻辑
当前问题本质是缺少行级访问控制,你需要将每一条笔记和其创建者的Cognito用户ID绑定,所有CRUD操作都校验当前登录用户和资源归属用户一致即可,AWS体系下可通过以下标准方案实现,无需引入额外第三方组件。
分步实现指引
1. 笔记存储表新增用户归属字段
无论你使用DynamoDB还是其他存储服务,都需要在每条笔记记录中新增userId字段,取值为创建该笔记用户的Cognito唯一ID(即Cognito返回JWT令牌中的sub声明值)。如果使用DynamoDB作为存储,推荐将userId设为分区键、noteId设为排序键,天然支持按用户快速查询自有笔记列表。2. 接口层配置身份校验
如果你使用API Gateway + Lambda的经典无服务架构,按以下配置:- 首先在API Gateway中配置Cognito授权器,所有笔记相关的CRUD接口都绑定该授权器,未携带有效Cognito令牌的请求会直接被拦截返回401状态码
- Lambda处理业务逻辑时,从API Gateway传递的请求上下文中直接提取当前登录用户的Cognito ID,不要从客户端请求参数中读取用户身份标识,避免用户伪造身份越权访问
Node.js环境下提取用户ID的示例代码:
// 从API Gateway授权上下文提取当前用户Cognito ID const currentUserId = event.requestContext.authorizer.claims.sub;3. 所有CRUD操作增加归属校验
所有数据库操作都必须绑定当前用户ID,禁止执行不带userId过滤条件的全局操作:- 创建笔记:写入数据库时强制将
currentUserId赋值给记录的userId字段,忽略客户端传递的userId参数 - 查询笔记列表/单条笔记:查询条件必须添加
userId = currentUserId过滤,查询单条笔记时除noteId外必须同时校验归属用户ID - 更新/删除笔记:操作前先校验目标笔记的
userId是否等于currentUserId,匹配才允许执行操作,不匹配直接返回403无权限
- 创建笔记:写入数据库时强制将
进阶:DynamoDB细粒度访问控制(可选)
如果你想进一步简化Lambda中的校验逻辑,可以给Lambda执行角色配置DynamoDB细粒度访问权限,强制只能操作用户归属为当前登录用户的记录,权限策略示例:{ "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:UpdateItem", "dynamodb:DeleteItem" ], "Resource": "arn:aws:dynamodb:<AWS区域>:<你的账号ID>:table/<你的笔记表名>", "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"] } } }
问题排查
如果配置完成后仍存在越权访问问题,优先检查两个点:
- Lambda中是否存在不带
userId过滤条件的全局查询/扫描操作 - 校验逻辑中是否错误使用了客户端传递的用户ID,而非授权上下文提取的用户ID
内容的提问来源于stack exchange,提问作者Wayne Wang
相关产品推荐
相关产品推荐

