1

我正在尝试为我的 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 令牌并验证/验证它。但是,我想在全局级别上执行此操作,而不必将上下文参数添加到我的所有方法中。我正在尝试按照此处所述实现 ResolverInterceptor 。

但是,我不知道如何将这个 Interceptor 注册到 spring 应用程序中,以便正确调用它。谁能帮我?

提前致谢, 马蒂亚斯

4

1 回答 1

4

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

如果由于某种原因这不是一个选项,是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,您想抛出一个AbortExecutionException以防止进一步执行。

于 2019-07-31T11:50:49.633 回答