Spring Security 在graphql-spring-boot-starter中使用无身份验证的内省查询

q1qsirdb  于 2023-10-20  发布在  Spring
关注(0)|答案(1)|浏览(137)

使用graphql-spring-boot-starter库https://github.com/graphql-java-kickstart/graphql-spring-boot,是否可以保护所有请求,但只允许graphql内省查询进行身份验证?
该项目已启用Spring安全性来使用OAuth2,因此每个请求都是安全的。
谢谢你的任何提示或帮助。

wecizke3

wecizke31#

你可以在application.yml中为你想在没有授权的情况下执行的graphql操作定义一个属性。例如,在application.yml -> authorization中:排除操作:IntrospectionQuery
在WebSecurityConfig.java中,您可以如下绑定您的excludedOperation变量,@Value(“${authorization.excludedoperation}”)private String excludedOperations;
并将excludedOperation定义为GraphQLServletExecutor实现GraphQLServletExecutorImpl中的字段。在www.example.com中WebSecurityConfig.java,从返回GraphQLServletExecutor(SpqrMvcAutoConfiguration.graphQLExecutor的替换)newGraphQLExecutor的@Bean方法中,返回GraphQLServletExecutorImpl,并将excludedOperation作为构造函数参数之一。
在GraphQLServletExecutorImpl中,确保在execute函数中,只有当GraphQL请求中的OperationName不包含排除的操作(在您的情况下是IntrospectionQuery)时,您才进行授权。

public Map<String, Object> execute(GraphQL graphQL, GraphQLRequest graphQLRequest, NativeWebRequest nativeRequest) {

    ExecutionInput input = buildInput(graphQLRequest, nativeRequest, contextFactory, dataLoaderRegistryFactory);

    if (!excludedOperations.contains(graphQLRequest.getOperationName())) {
        
        // check the access_token
        HttpServletRequest request = nativeRequest.getNativeRequest(HttpServletRequest.class);
            bearerTokenAuthorizer.authorize(EMPTY_AUTH_ANNOTATION, request);
            //do your thing

    }

    return graphQL.execute(input).toSpecification();
}

相关问题