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

如何基于AWS构建支持用户个性化内容访问的简单Web应用

AWS笔记应用行级权限控制(仅允许用户访问自有笔记)实现方案

核心逻辑

当前问题本质是缺少行级访问控制,你需要将每一条笔记和其创建者的Cognito用户ID绑定,所有CRUD操作都校验当前登录用户和资源归属用户一致即可,AWS体系下可通过以下标准方案实现,无需引入额外第三方组件。

分步实现指引

  • 1. 笔记存储表新增用户归属字段

    无论你使用DynamoDB还是其他存储服务,都需要在每条笔记记录中新增userId字段,取值为创建该笔记用户的Cognito唯一ID(即Cognito返回JWT令牌中的sub声明值)。如果使用DynamoDB作为存储,推荐将userId设为分区键、noteId设为排序键,天然支持按用户快速查询自有笔记列表。
  • 2. 接口层配置身份校验

    如果你使用API Gateway + Lambda的经典无服务架构,按以下配置:
    1. 首先在API Gateway中配置Cognito授权器,所有笔记相关的CRUD接口都绑定该授权器,未携带有效Cognito令牌的请求会直接被拦截返回401状态码
    2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:27:04