GraphQL пропуск / доступ по FIELD_DEFINITION, RBA C для полей? - PullRequest
0 голосов
/ 22 апреля 2020

Давайте представим, что у нас есть простой тип в 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

при запросе от пользователя без обязательных условий.

Можно ли полностью пропустить это поле? Может быть, получить доступ к распознавателю и удалить поля, не разбивая все это?

1 Ответ

0 голосов
/ 24 апреля 2020

В конце концов, весь вопрос, который я задал, неправильный, а не только код.

Лог c позади некорректен, я не могу манипулировать выводом таким образом. Как предложил @xadm, и я хочу поблагодарить его за то, что он указал мне правильный путь, я поставлю «охранника» на поле. Если требования не выполняются, весь запрос не выполняется.

Даже при отключенном самоанализе кто-то может попытаться «угадать», какие другие поля присутствуют в типе. Защита запроса путем сбоя, если кто-то пытается получить доступ к полям без обязательных условий, является правильным способом сделать это.

В других случаях IE различные выходные данные, основанные на различных условиях, будут покрыты фабричным шаблоном для пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...