GraphQL skipaccess on FIELD_DEFINITION, RBAC for fields?

让我们想象一下,在graphql中拥有一个简单的类型。

type Coupon {
    id: ID!
    code: String!
}

我希望只有当用户有确定的条件时才显示id字段。然后我将创建一个指令

directive IncludeWhen(cond: String!) on FIELD_DEFINITION

并编辑代码为

type Coupon {
    id: ID! @IncludeWhen(cond: "ADMIN")
    code: String!
}

我会在指令解析器中检查用户是否有必要的权限。

export class IncludeWhenDirective extends SchemaDirectiveVisitor {
    public visitFieldDefinition(field) {
        const { resolve = defaultFieldResolver } = field;

        const requiredCond = this.args.cond;

        field.resolve = async function (...args) {
            const context = args[2];
            const currentUser = context.currentUser;

            let result;

            if (currentUser.hasCond(requiredCond) {
                throw new AuthenticationError();
                result = await resolve.apply(this, args);
            }

            return result;
        };
    }
}

嗯,这是错的 端点返回一个错误,如

Cannot return null for non-nullable field Coupon.ID

当从用户那里查询时,没有必要的条件。

是否可以完全跳过这个字段?也许访问解析器并删除这些字段而不破坏整个事情?

解决方案:

最后,我做的整个问题都是错的,不仅仅是代码。

后面的逻辑是有问题的,我不能这样操作输出。按照@xadm的建议,我要感谢他给我指出了正确的方法,我会在字段上设置一个 “防护”。如果不满足要求,整个查询就会失败。

即使禁用了自省功能,也会有人试图 “猜测 “一个类型上还有哪些字段存在。如果有人试图访问没有要求条件的字段,通过失败来保护查询是正确的方法。

对于其他情况,IE基于不同条件的不同输出将被覆盖,例如工厂模式。

给TA打赏
共{{data.count}}人
人已打赏
未分类

使用scanf[重复]忽略字符串的部分。

2022-9-8 19:15:42

未分类

字符串regex无法分割封闭括号内的单词

2022-9-8 19:26:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索