我正在尝试为我的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,以便正确调用它。谁能帮我吗?
预先感谢,马蒂亚斯
答案 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
以防止进一步执行。