Flutter集成Amplify Authenticator后,Cognito用户与RDS数据关联方法咨询
核心思路
AWS Cognito每个用户都有一个全局唯一的sub标识符,这就是关联用户与RDS专属数据的核心密钥。你需要在RDS的日记表中存储这个sub,再通过Amplify搭建的服务层,确保每一次数据操作都基于当前用户的sub做过滤,实现数据的用户隔离。
具体实现步骤
1. RDS数据表改造
在你的日记表(比如命名为diaries)中新增user_sub字段,类型设为VARCHAR(255)(Cognito的sub是字符串格式),建议给这个字段加索引提升查询效率。示例SQL:
CREATE TABLE diaries ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, user_sub VARCHAR(255) NOT NULL, INDEX idx_user_sub (user_sub) );
2. 搭建Amplify数据访问层
绝对不能让Flutter直接连接RDS,必须通过Amplify的中间服务层处理请求,推荐两种实用方案:
方案一:AppSync + Lambda
- 用AppSync定义GraphQL Schema,开启Cognito身份验证,配置规则让请求自动携带当前用户的
sub。 - 编写Lambda函数作为AppSync的数据源,在Lambda中用数据库驱动(比如MySQL的
mysql2包)连接RDS,所有CRUD操作都要带上user_sub的过滤逻辑。 - Flutter端调用Amplify API时,无需手动传递
sub,Authenticator会自动在请求中附加用户身份信息:
// Flutter端新增日记示例 final response = await Amplify.API.mutate( request: MutateOptions( document: gql(''' mutation CreateDiary(\$title: String!, \$content: String!) { createDiary(title: \$title, content: \$content) { id title } } '''), variables: { 'title': '今日随笔', 'content': '今天完成了Amplify的集成测试...' } ) ).response;
Lambda中获取用户sub并操作数据库的示例:
exports.handler = async (event) => { // 从AppSync上下文取出当前用户的sub const userSub = event.identity.sub; // 插入数据时强制带上userSub await db.query('INSERT INTO diaries (title, content, user_sub) VALUES (?, ?, ?)', [event.arguments.title, event.arguments.content, userSub]); };
方案二:Lambda + API Gateway
- 创建Lambda函数连接RDS,处理日记的增删改查,通过API Gateway的请求上下文获取Cognito用户的
sub。 - 给API Gateway配置Cognito身份验证,只允许已登录用户访问接口。
- Flutter端通过Amplify API调用这些接口,同样无需手动传递
sub,Amplify会自动附加身份令牌。
3. 强制数据隔离规则
所有数据操作必须严格遵循以下规则:
- 查询用户自身日记时,SQL必须加
WHERE user_sub = ?过滤 - 新增/更新日记时,必须将当前用户的
sub写入user_sub字段 - 禁止任何不带
user_sub过滤的查询,防止越权访问他人数据
4. 本地开发注意事项
- 给Lambda配置IAM角色,确保它有访问RDS的权限
- 如果RDS在VPC内,要把Lambda部署到同VPC,或者修改RDS安全组允许Lambda的IP访问
- Flutter端初始化Amplify时,要正确配置Auth和API模块
内容的提问来源于stack exchange,提问作者SarahB
相关产品推荐
相关产品推荐

