如何在Amplify Gen2中保留自定义认证角色策略不被覆盖?
问题描述
我用Amplify为Flutter应用配置了简单认证,通过npm create amplify@latest -y创建环境,npx ampx sandbox --outputs-format dart --outputs-out-dir lib启动沙箱,遵循Gen2文档配置,流程正常。
相关配置文件如下:
backend.ts:
defineBackend({ auth, data });
auth/resource.ts:
export const auth = defineAuth({ loginWith: { email: true } });
data/resource.ts:
const schema = a.schema({ Todo: a.model({ content: a.string() }).authorization((allow) => [allow.guest()]) }); export type Schema = ClientSchema<typeof schema>; export const data = defineData({ schema, authorizationModes: { defaultAuthorizationMode: 'iam' } });
我需要给认证角色添加自定义IoT权限,示例策略:
{ "Effect": "Allow", "Action": "iot:*", "Resource": "*" }
手动添加后权限生效,但每次修改数据Schema(比如把Todo的授权从allow.guest()改成allow.owner()),Amplify都会重新生成角色策略,导致自定义权限丢失。
请问怎么在依赖Amplify管理数据Schema的同时,保留自定义角色策略语句,避免每次部署后手动修改?
解决方案
在Amplify Gen2中,你可以通过扩展认证角色的策略来永久保留自定义权限,避免被自动覆盖。具体操作如下:
- 修改
auth/resource.ts,在defineAuth的配置中添加roles字段,对认证后的用户角色(authenticatedUser)追加自定义IoT权限:
import { defineAuth, PolicyStatement } from '@aws-amplify/backend'; export const auth = defineAuth({ loginWith: { email: true }, roles: { authenticatedUser: { permissions: [ new PolicyStatement({ actions: ["iot:*"], resources: ["*"], effect: "Allow" }) ] } } });
- 如果需要给访客角色(
unauthenticatedUser)也添加权限,同样在roles里配置:
roles: { authenticatedUser: { /* 如上配置 */ }, unauthenticatedUser: { permissions: [ new PolicyStatement({ actions: ["iot:*"], resources: ["*"], effect: "Allow" }) ] } }
- 重新部署或启动沙箱:
npx ampx sandbox --outputs-format dart --outputs-out-dir lib
这样配置后,Amplify会在自动生成角色策略的基础上,合并你定义的自定义权限,后续修改Schema重新部署时,自定义IoT权限会被保留,不会被覆盖。
注意:PolicyStatement的参数要符合IAM策略格式,确保actions和resources的写法正确。
内容的提问来源于stack exchange,提问作者sretko
相关产品推荐
相关产品推荐

