我正试图在我的项目中禁用GraphQL
Introspection,但在我使用的特定框架方面运气不佳。有些文章说它可以在CcodeRegistry
模块中完成,但这是一个反编译的只读源代码。有人用GraphQL-java-kickstart
框架实现了这一点吗?
以下是我的pom文件中的依赖项:
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
<version>${graphql.java.version}</version>
</dependency>
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-java-tools</artifactId>
<version>${graphql.java.tools.version}</version>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java-extended-validation</artifactId>
<version>0.0.3</version>
</dependency>
Graphql-java
使用graphql-java,您可以使用GraphQLSchema.Builder
构建一个GraphQLSchema
。在生成以禁用内省查询之前,您需要设置内省字段的生成器可见性。
GraphQLSchema.Builder builder = GraphQLSchema.newSchema()
.query(query)
.mutation(mutation)
.subscription(subscription)
.additionalTypes(dictionary);
builder.fieldVisibility(NoIntrospectionGraphqlFieldVisibility.NO_INTROSPECTION_FIELD_VISIBILITY);
GraphQLSchema = builder.build();
您可以使用graphqljava工具实现作为参考。
Graphql java工具
使用graphql-java工具,可以使用SchemaParserBuilder
构建SchemaParser
。SchemaParserBuilder需要一个SchemaParserOptions对象。在构建SchemaParserOptions时,可以启用或禁用内省查询。这里是一个非常简化的实现。
SchemaParserBuilder builder = new SchemaParserBuilder();
final SchemaParserOptions.Builder optionsBuilder = newOptions();
optionsBuilder.introspectionEnabled(introspectionEnabled);
return builder.options(optionsBuilder.build()).build();
您可以使用graphqlspring-boot实现作为参考。
Graphql弹簧引导
如果您使用的是graphql-spring-boot,根据graphql-java工具README,您可以通过在application.properties或application.yml文件中将graphql.tools.introspection-enabled
属性设置为false来禁用内省查询。
graphql:
tools:
schema-location-pattern: "**/*.graphqls"
# Enable or disable the introspection query. Disabling it puts your server in contravention of the GraphQL
# specification and expectations of most clients, so use this option with caution
introspection-enabled: false
Graphql spqr
对于Graphql-spqr,其思想与Graphql-java中的相同:设置生成器字段可见性。请参阅我对这个问题的回答,了解如何实现它。