1

我正在使用 graphql-ruby 并试图保护管理员在这样的架构中的突变

class MySchema < GraphQL::Schema

  mutation(Types::Admin::MutationType) if context[:current_user].admin?

  mutation(Types::MutationType)
  query(Types::QueryType)

end

但我没有那里的上下文。也尝试在 中做同样的事情Types::Admin::MutationType,同样的结果。

是否可以在解决之前在任何地方检查上下文?

4

1 回答 1

0

我发现的最好的指南之一就是这里。它提供了广泛的文档和指南。尝试使用该self.visible?(ctx)方法。我也觉得你是在与宝石战斗而不是与它合作。尝试按照以下概述重构您的代码。它可能更容易使用。

在调用该方法之前,该context对象不会附加到模式。execute这通常发生在您的“app/controllers/graphql_controller.rb”文件中。所以总的来说,在您的应用程序执行您的模式之前,您将无法访问“上下文”对象。由于 QueryType 和 MutationType 附加到它之后,假设您使用了内置的代码生成工具,您可能想要执行以下操作。


# '/app/graphql/my_schema.rb'

class MySchema < GraphQL::Schema
  mutation(Types::MutationType)
  query(Types::QueryType)
end

# '/app/graphql/types/mutation_type.rb'
class Types::MutationType < Types::BaseObject
  field :some_admin_mutation, mutation: Mutations::Admin::SomeAdminMutation
end


# '/app/graphql/mutations/admin/some_admin_mutation.rb'
class Mutations::Admin::SomeAdminMutation < Mutations::BaseMutation
  ...

   # using this class method, you can choose to hide certain mutations
   def self.visible?(context)
      context[:current_user].admin?
   end
end

使用以下 graphql 查询对其进行测试(我使用 apollo for chrome)

{
  __schema {
    mutationType {
      name
      fields {
        name
      }
    }
  }
}
于 2019-11-01T18:35:34.563 回答