如何使用SPQR和Spring注册ResolverInterceptors

时间:2019-07-27 18:18:52

标签: graphql-spqr

我正在尝试为我的spring-boot / graphQL / SPQR-project创建一些身份验证机制。我设法通过@GraphQLRootContext注释在单个服务方法上做到了这一点:

@GraphQLMutation(name = "createProblem")
public Problem createProblem(
        @GraphQLRootContext DefaultGlobalContext<Object> context,
        @GraphQLArgument(name = "problemInput") @Valid Problem problemInput)
{ 
    WebRequest request = (WebRequest) context.getNativeRequest();
    String token = request.getHeader("token");
}

在这里,我可以提取JWT令牌并进行验证/验证。 但是,我想在全局级别上执行此操作,而不必将上下文参数添加到我的所有方法中。 我正在尝试实现here中所述的ResolverInterceptor。

但是,我不知道如何在Spring应用程序中注册此Interceptor,以便正确调用它。谁能帮我吗?

预先感谢,马蒂亚斯

1 个答案:

答案 0 :(得分:3)

我全心全意地建议您使用现有的Spring功能来处理安全性,而不要推出自己的功能,因为它已经具有处理JWT所需的一切。由于SPQR将调用Spring管理的bean,因此所有Spring功能都将正常运行。

如果出于某种原因这不是一个选择,那么可以使用new_password_confirmation,因为它可以拦截任何解析程序调用并检查根上下文。

对于您的情况,如果希望一个ResolverInterceptor全局适用于所有解析器,则可以使用ResolverInterceptor

GlobalResolverInterceptorFactory

如果您想优化一点并仅拦截某些解析器,例如基于注释,您可以提供自定义@Bean public ExtensionProvider<GeneratorConfiguration, ResolverInterceptorFactory> customInterceptors() { return (config, interceptors) -> interceptors.append(new GlobalResolverInterceptorFactory(customGlobalInterceptors); } ,例如:

ResolverInterceptorFactory

如果令牌丢失或无效,则在public class AuthInterceptorFactory implements ResolverInterceptorFactory { List<ResolverInterceptor> authInterceptor = Collections.singletonList(new AuthInterceptor()); @Override public List<ResolverInterceptor> getInterceptors(ResolverInterceptorFactoryParams params) { return params.getResolver().getTypedElement().isAnnotationPresent(Auth.class) ? authInterceptor : Collections.emptyList(); } } 内,您想抛出ResolverInterceptor以防止进一步执行。