要实现基于字段值的GraphQL授权,需要使用AWS Amplify中的权限指令(auth directive)和自定义认证规则(custom auth rule)来对GraphQL查询进行授权。下面是详细的步骤:
enum Status {
PUBLISHED
DRAFT
ARCHIVED
}
type Post @model
@auth(rules: [
{ allow: groups, groups: ["Admin"] },
{ allow: private, operations: [read], provider: iam, ownerField: "userID" },
{ allow: public, operations: [read] }
]) {
id: ID!
title: String!
status: Status! @auth(rules: [{ allow: groups, groups: ["Admin", "Publisher"], operations: [read] }])
content: String!
userID: String!
}
const customAuthRules = {
status: {
allow: async (args, context) => {
const { status } = args;
const { claims } = context;
if (!status) {
throw new Error('Missing status');
}
if (!claims || !claims['custom:status']) {
throw new Error('Missing custom:status claim');
}
const allowed = ['PUBLISHED', 'ARCHIVED'].includes(status);
const userStatus = claims['custom:status'];
const authorized = userStatus && userStatus.includes(status);
return allowed && authorized;
}
}
};
Amplify.addCustomAuthRules(customAuthRules);