基于AWS Amplify Gen 2(Angular)的DynamoDB表权限配置:如何实现访客只读、登录用户按组分配更高权限
基于AWS Amplify Gen 2(Angular)的DynamoDB表权限配置:如何实现访客只读、登录用户按组分配更高权限
嗨,我来帮你搞定Amplify Gen2 Angular里的这个权限配置问题!你要的是访客只读、登录用户按组拿更高权限的混合策略,Amplify其实完全能通过自定义授权规则实现,我给你一步步拆解得明明白白:
一、先在数据模型里配置分层授权规则
直接在你的Amplify schema文件里,给DynamoDB对应的业务模型添加授权规则,同时覆盖访客和不同用户组的权限:
import { type ClientSchema, a, defineData } from '@aws-amplify/backend'; const schema = a.schema({ // 这里以Post模型为例,你可以换成自己的业务模型 Post: a .model({ title: a.string().required(), content: a.string().required() }) .authorization([ // 给未认证的访客配置只读权限,只能看数据 a.allow.guest().to(['read']), // 给editors组的登录用户配置增、查、改权限 a.allow.group('editors').to(['create', 'read', 'update']), // 给admins组的用户配置全权限,增删改查都能做 a.allow.group('admins').to(['create', 'read', 'update', 'delete']) ]) }); export type Schema = ClientSchema<typeof schema>; export const data = defineData({ schema, // 配置默认授权模式为身份池,这样能同时支持未认证和认证用户 authorizationModes: { defaultAuthorizationMode: 'identityPool' } });
这段代码的逻辑很直白:访客没登录的时候只能读数据,editors组的登录用户能新建、查看和修改数据,admins组的用户则拥有完全的操作权限。
二、提前搞定基础配置
有两个基础配置要先做好:
- 确保你的Amplify项目开启了身份池的未认证用户支持,上面代码里的
defaultAuthorizationMode: 'identityPool'已经帮你搞定了核心部分,它会自动关联Cognito用户池和身份池 - 提前在Cognito用户池里建好对应的用户组(比如editors、admins),并且把用户分配到对应的组里——只有用户属于某个组,Amplify才会给它应用该组的权限规则
三、Angular端不用额外折腾
在Angular项目里,你不需要写复杂的权限判断逻辑,Amplify会自动处理:
- 用户没登录时,Amplify用未认证身份发请求,这时候只能调用读取类的API,要是想新建、修改或者删除数据,直接会被拒绝
- 用户登录后,Amplify会自动带上用户的身份信息和所属组,后端的授权规则会自动验证,允许该组对应的操作
四、进阶:更细粒度的权限控制
如果你的业务需要更精准的权限(比如editors组用户只能修改自己创建的数据),可以结合owner字段和组规则,示例代码如下:
Post: a .model({ title: a.string().required(), content: a.string().required(), // 添加owner字段,用来关联数据的创建者ID owner: a.string() }) .authorization([ a.allow.guest().to(['read']), // editors组用户可以新建、查看数据 a.allow.group('editors').to(['create', 'read']), // editors组用户只能修改自己创建的数据 a.allow.group('editors').to(['update']).where((model) => model.owner.eq(a.authenticatedUser().id())), // admins组拥有全权限 a.allow.group('admins').to(['create', 'read', 'update', 'delete']) ]) // 自动把owner字段设为当前认证用户的ID,不用手动写 .autoPopulate('owner', (context) => context.authenticatedUser?.id)
这样配置后,editors组的用户只能修改自己创建的内容,admins组还是能操作所有数据,访客依旧只读,完全能满足复杂的权限需求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

