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

如何在AWS Amplify注册时将用户分配到特定Cognito用户组

实现Cognito自动分组与基于组的数据权限隔离

一、自动为注册用户分配Cognito组

方案:用Cognito Post Confirmation Lambda触发器

用户完成注册并确认账号后,Cognito会触发这个Lambda函数,你可以在函数里自动将用户添加到指定组。

1. 创建并配置Lambda函数

  • 登录AWS控制台进入Lambda服务,新建函数选择「从头开始创作」,运行时选Node.js(或你熟悉的语言)。
  • 给Lambda加Cognito权限:进入Lambda的「配置」→「权限」,找到执行角色的IAM策略,添加以下权限(替换成你的用户池信息):
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["cognito-idp:AdminAddUserToGroup"],
      "Resource": "arn:aws:cognito-idp:你的区域:你的账号ID:userpool/你的用户池ID"
    }
  ]
}

2. 编写Lambda代码

如果默认所有注册用户都归为Clients组,用这段代码:

const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider();

exports.handler = async (event) => {
  const params = {
    GroupName: 'Clients',
    UserPoolId: event.userPoolId,
    Username: event.userName
  };
  
  try {
    await cognito.adminAddUserToGroup(params).promise();
    return event;
  } catch (err) {
    console.error('添加用户到组失败:', err);
    throw err;
  }
};

如果需要按用户注册时选择的角色分配组(比如前端表单让用户选「客户/教师/管理员」),先在Cognito用户池的「属性」→「自定义属性」里添加custom:userType,再用这段带判断的代码:

const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider();

exports.handler = async (event) => {
  const userType = event.request.userAttributes['custom:userType'];
  let groupName;
  
  switch(userType) {
    case 'client':
      groupName = 'Clients';
      break;
    case 'teacher':
      groupName = 'Teachers';
      break;
    case 'admin':
      groupName = 'Admins';
      break;
    default:
      groupName = 'Clients'; // 兜底默认组
  }
  
  const params = {
    GroupName: groupName,
    UserPoolId: event.userPoolId,
    Username: event.userName
  };
  
  try {
    await cognito.adminAddUserToGroup(params).promise();
    return event;
  } catch (err) {
    console.error('添加用户到组失败:', err);
    throw err;
  }
};

3. 绑定Cognito触发器

进入Cognito用户池的「配置」→「触发器」,找到「Post confirmation」选项,选择你刚创建的Lambda函数,保存即可。

二、基于Cognito组实现数据访问隔离

结合你现有的GraphQL Schema,扩展@auth规则,给不同组分配对应操作权限:

示例1:ClassGroup的多组权限配置

比如实现:

  • 未登录用户也能读取ClassGroup
  • Admins组拥有全权限(读/写/改/删)
  • Teachers组可创建、更新自己负责的班级,且能读取所有班级
  • Clients组仅能读取所有班级

修改后的Schema:

type ClassGroup @model 
  @auth(rules: [
    { allow: public, operations: [read] },
    { allow: groups, groups: ["Admins"], operations: [read, create, update, delete] },
    { 
      allow: groups, 
      groups: ["Teachers"], 
      operations: [read, create],
      // 可选:限制教师只能修改自己创建的班级,需添加teacherId字段关联用户
      allow: owner,
      ownerField: "teacherId",
      operations: [update, delete]
    },
    { allow: groups, groups: ["Clients"], operations: [read] }
  ]) {
  id: ID!
  className: String
  semesterPrice: Float
  teacherId: String # 存储创建该班级的教师用户名
}

示例2:用户专属数据的权限隔离

比如Client的订单数据,只有订单所属用户和Admins能访问:

type ClientOrder @model 
  @auth(rules: [
    { allow: owner, operations: [read, update] },
    { allow: groups, groups: ["Admins"], operations: [read, create, update, delete] }
  ]) {
  id: ID!
  orderNumber: String
  clientId: String # 关联下单用户的用户名
}

核心说明

  • 用allow: groups指定允许访问的组及对应操作类型
  • 结合ownerField可实现组内用户的细粒度权限控制(如教师仅能管理自己的班级)
  • 修改Schema后,运行amplify push更新API配置即可生效

内容的提问来源于stack exchange,提问作者Lacrosse343

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:27:45