我在模式拼接中使用 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
类,但到目前为止我还没有设法返回错误