2

出于公司政策的原因,我必须禁用graphql-rubygem 的自省功能(使__schema请求失败/返回 404)。

我如何实现这一目标?

该应用程序基于 Ruby on Rails 版本 5.2.2,graphql-rubygem 版本为 1.8.12。

4

3 回答 3

2

graphql-ruby文档中:

您可以通过在自省命名空间中创建自定义 EntryPoints 类来重新实现这些字段或创建新字段:

module Introspection
  class EntryPoints < GraphQL::Introspection::EntryPoints
    # ...
  end
end

也就是说,只需引入def __schema重定向到404或显式响应的方法404


FWIW,这是您要覆盖的原始代码。

于 2019-01-06T15:26:04.643 回答
2

graphql-ruby (>= 1.9.7) 支持 disable_introspection_entry_points 。

https://github.com/rmosolgo/graphql-ruby/pull/2327

于 2019-07-18T11:33:34.927 回答
1

如果有人正在寻找动态选项,一种方法可能是使用自定义分析器。

  1. 调用架构时传递上下文变量,例如 authorize_introspection:
class GraphqlController < ApplicationController

  def execute
    context = context.merge(authorize_introspection: admin?)

    result = MySchema.execute(query, 
      variables: variables, 
      context: context, 
      operation_name: operation_name, 
      root_value: root_value
    )
    render json: result.to_json
  end

 (...)
  1. 然后在这里使用
class QueryAnalyzer < GraphQL::Analysis::AST::Analyzer

  def on_leave_field(_node, _parent, visitor)
    introspection_field_names = %w[__schema __type]
    field_def = visitor.field_definition

    if field_def.introspection? && introspection_field_names.include?(field_def.graphql_name)
      @introspection_present = true
    end

    super
  end

  def result
    return if introspection?

    GraphQL::AnalysisError.new('Not authorized to query schema internals')
  end

  private

  def introspection?
    @introspection_present && introspection_authorized?
  end

  def introspection_authorized?
    ENV['DISABLE_INTROSPECTION_ENTRY_POINTS'] != 'true' && query.context[:authorize_introspection]
  end
end
  1. 在架构上进行声明
  class MySchema < GraphQL::Schema

    use GraphQL::Analysis::AST
    query_analyzer QueryAnalyzer

    (...)
  end

来源:https ://github.com/rmosolgo/graphql-ruby/issues/1240#issuecomment-393936456

于 2020-10-06T11:24:50.823 回答