Я использую ссылку apollo в схеме сшивания в качестве уровня контроля доступа.Я не совсем уверен, как заставить ссылку возвращать ответ об ошибке, если у пользователя нет прав доступа к определенной операции.Я знаю о таких пакетах, как graphql-shield
и graphql-middleware
, но мне любопытно, что можно добиться базового контроля доступа, используя ссылку apollo.
Вот как выглядит моя ссылка:
const link = setContext((request, previousContext) => merge({
headers: {
...headers,
context: `${JSON.stringify(previousContext.graphqlContext ? _.omit(previousContext.graphqlContext, ['logger', 'models']) : {})}`,
},
})).concat(middlewareLink).concat(new HttpLink({ uri, fetch }));
У middlewareLink
есть checkPermissions
, который возвращает true
из false
в зависимости от роли пользователя
const middlewareLink = new ApolloLink((operation, forward) => {
const { operationName } = operation;
if (operationName !== 'IntrospectionQuery') {
const { variables } = operation;
const context = operation.getContext().graphqlContext;
const hasAccess = checkPermissions({ operationName, context, variables });
if (!hasAccess) {
// ...
}
}
return forward(operation);
});
Что мне делать, если hasAccess
равен false
.Я думаю, мне не нужно пересылать операцию, так как на данный момент ясно, что у пользователя нет доступа к ней
ОБНОВЛЕНИЕ
Я думаю, что мне нужносделать, это расширить класс ApolloLink
, но до сих пор мне не удалось вернуть ошибку