我正在使用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
中做相同的事情,得到相同的结果。
在解决之前是否可以在任何地方签出上下文?
答案 0 :(得分:0)
here是我发现的最好甚至最好的指南之一。它提供了广泛的文档和指南。尝试使用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查询进行测试(我在Chrome中使用apollo)
{
__schema {
mutationType {
name
fields {
name
}
}
}
}