我已经将我的spring引导应用程序集成到graphql spring启动器https://github.com/leangen/graphql-spqr-spring-boot-starter中,我需要找到一种方法来禁用graphql模式内省,因为它是生产中的一个安全问题。
发布于 2020-10-27 05:42:55
我使用的是graphql 0.9.9和graphql spring-boot-starter 0.0.4,但是代码库更改为graphql 0.10。我将尝试讨论这两种情况,但请记住,您可能需要稍微修改一下代码片段。
在启动器中,GraphQLSchemaGenerator是一个用来生成GraphQSchema的bean .它在io.leangen.graphql.spqr.spring.autoconfigure.BaseAutoConfiguration (v0.10)或io.leangen.graphql.spqr.spring.autoconfigure.SpqrAutoConfiguration (v0.9)中定义。
您需要提供您自己的GraphQLSchemaGenerator bean,它将为内省查询设置GraphqlFieldVisibility。根据这个问题(由google:https://webcache.googleusercontent.com/search?q=cache:8VV29F3ovZsJ:https://github.com/leangen/graphql-spqr/issues/305缓存),有两种不同的方法来设置字段的可见性:
GraphQL-SPQR0.9
@Bean
public GraphQLSchemaGenerator graphQLSchemaGenerator(SpqrProperties spqrProperties) {
GraphQLSchemaGenerator schemaGenerator = new GraphQLSchemaGenerator();
schemaGenerator.withSchemaProcessors((schemaBuilder, buildContext) ->
{
schemaBuilder.fieldVisibility(new NoIntrospectionGraphqlFieldVisibility());
return schemaBuilder;
});
//Other GraphQLSchemaGenerator configuration
}Graphql 0.10
@Bean
public GraphQLSchemaGenerator graphQLSchemaGenerator(SpqrProperties spqrProperties) {
GraphQLSchemaGenerator schemaGenerator = new GraphQLSchemaGenerator();
schemaGenerator.withSchemaProcessors((schemaBuilder, buildContext) ->
{
buildContext.codeRegistry.fieldVisibility(NoIntrospectionGraphqlFieldVisibility.NO_INTROSPECTION_FIELD_VISIBILITY);
return schemaBuilder;
});
//Other GraphQLSchemaGenerator configuration
}您可以从默认实现中获得灵感,以正确设置GraphQLGenerator。
发布于 2020-11-08 12:04:25
这似乎可行,在SpqrAutoConfiguration类中有一个bean从生成器对象到generateGraphql模式。
@Bean
public GraphQLSchema graphQLSchema(GraphQLSchemaGenerator schemaGenerator) {
schemaGenerator.withSchemaProcessors((schemaBuilder, buildContext) ->
{
schemaBuilder.fieldVisibility(new NoIntrospectionGraphqlFieldVisibility());
return schemaBuilder;
});
return schemaGenerator.generate();
}发布于 2020-12-15 05:09:02
schemaBuilder.fieldVisibility被否决了。
Graphql 0.10
@Bean
public GraphQLSchema graphQLSchema(GraphQLSchemaGenerator schemaGenerator) {
schemaGenerator.withSchemaProcessors((schemaBuilder, buildContext) -> {
schemaBuilder.codeRegistry(
buildContext
.codeRegistry
.fieldVisibility(NoIntrospectionGraphqlFieldVisibility.NO_INTROSPECTION_FIELD_VISIBILITY)
.build()
);
return schemaBuilder;
});
return schemaGenerator.generate();
}https://stackoverflow.com/questions/64520366
复制相似问题