如何检查实体在 appsync 中创建的权限
How to check permissions of an entity on create in appsync
抱歉标题不明确。但是,我很难描述它。
我正在使用 aws-appsync
和 aws cognito
进行身份验证。
我已经按照有关 @auth
注释的放大文档来处理突变和查询的权限。
这是我的架构示例。
用户可以创建条目并与他人共享。但是,他们应该只能阅读该条目,不应具有编辑它的权限。
一个条目也有多个注释。 (还有一些字段)
type Entry @model @versioned @auth (rules: [
{ allow: owner },
{ allow: owner, ownerField: "shared", queries: [get, list], mutations: []}
]) @searchable {
id: ID!
date: AWSDate
updated_at: AWSDateTime
text: String
notes: [Note] @connection(name: "EntryNotes")
shared: [String]!
}
这是注释
type Note @model @versioned @auth (rules: [{ allow: owner }]) {
id: ID!
text: String
track: Track!
diary: DiaryEntry @connection(name: "EntryNotes")
}
到目前为止一切正常。但问题是 Note
连接。
因为如果你创建一个笔记,你会像这样创建它:
mutation makeNote {
createNote (input: {
text: "Hello there!"
noteEntryId: "444c80ee-6fd9-4267-b371-c2ed4a3ccda4"
}) {
id
text
}
}
现在的问题是,您可以为您无权访问的条目创建注释。如果您以某种方式找出他们的 ID。
有没有办法在创建笔记之前检查您是否有权访问该条目?
目前,执行此操作的最佳方法是通过 Amplify CLI 中的自定义解析器。具体来说,您可以使用 AppSync 管道解析器在创建注释之前执行授权检查。您的管道解析器将包含两个函数。第一个将查找条目并将所有者与 $ctx.identity 进行比较。第二个函数将处理将记录写入 DynamoDB。您可以使用 build/resolvers/Mutation.createNote.re(q|s).vtl
中的相同逻辑来实现第二个功能,方法是将其复制到顶级 resolvers/
目录,然后从您的自定义资源中引用它。复制逻辑后,您需要通过将 @model
更改为 @model(mutations: { update: "updateNote", delete: "deleteNote" })
.
来禁用默认的 createNote 突变
有关如何设置自定义解析器的详细信息,请参阅 https://aws-amplify.github.io/docs/cli/graphql#add-a-custom-resolver-that-targets-a-dynamodb-table-from-model. For more information on pipeline resolvers (slightly different than the example in the amplify docs) see https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html. Also see the CloudFormation reference docs for AppSync https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-reference-appsync.html。
展望未来,我们正在研究一种允许您定义跨越@connections 的身份验证规则的设计。完成后,它将自动配置此模式,但尚未设置发布日期。
抱歉标题不明确。但是,我很难描述它。
我正在使用 aws-appsync
和 aws cognito
进行身份验证。
我已经按照有关 @auth
注释的放大文档来处理突变和查询的权限。
这是我的架构示例。 用户可以创建条目并与他人共享。但是,他们应该只能阅读该条目,不应具有编辑它的权限。
一个条目也有多个注释。 (还有一些字段)
type Entry @model @versioned @auth (rules: [
{ allow: owner },
{ allow: owner, ownerField: "shared", queries: [get, list], mutations: []}
]) @searchable {
id: ID!
date: AWSDate
updated_at: AWSDateTime
text: String
notes: [Note] @connection(name: "EntryNotes")
shared: [String]!
}
这是注释
type Note @model @versioned @auth (rules: [{ allow: owner }]) {
id: ID!
text: String
track: Track!
diary: DiaryEntry @connection(name: "EntryNotes")
}
到目前为止一切正常。但问题是 Note
连接。
因为如果你创建一个笔记,你会像这样创建它:
mutation makeNote {
createNote (input: {
text: "Hello there!"
noteEntryId: "444c80ee-6fd9-4267-b371-c2ed4a3ccda4"
}) {
id
text
}
}
现在的问题是,您可以为您无权访问的条目创建注释。如果您以某种方式找出他们的 ID。
有没有办法在创建笔记之前检查您是否有权访问该条目?
目前,执行此操作的最佳方法是通过 Amplify CLI 中的自定义解析器。具体来说,您可以使用 AppSync 管道解析器在创建注释之前执行授权检查。您的管道解析器将包含两个函数。第一个将查找条目并将所有者与 $ctx.identity 进行比较。第二个函数将处理将记录写入 DynamoDB。您可以使用 build/resolvers/Mutation.createNote.re(q|s).vtl
中的相同逻辑来实现第二个功能,方法是将其复制到顶级 resolvers/
目录,然后从您的自定义资源中引用它。复制逻辑后,您需要通过将 @model
更改为 @model(mutations: { update: "updateNote", delete: "deleteNote" })
.
有关如何设置自定义解析器的详细信息,请参阅 https://aws-amplify.github.io/docs/cli/graphql#add-a-custom-resolver-that-targets-a-dynamodb-table-from-model. For more information on pipeline resolvers (slightly different than the example in the amplify docs) see https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html. Also see the CloudFormation reference docs for AppSync https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-reference-appsync.html。
展望未来,我们正在研究一种允许您定义跨越@connections 的身份验证规则的设计。完成后,它将自动配置此模式,但尚未设置发布日期。