对graphql-ruby中的字段进行授权

时间:2019-03-09 08:29:53

标签: ruby graphql graphql-ruby

从这个guide开始,我不明白如何在graphql-ruby中的字段上添加授权。

我了解我们如何拒绝访问整个对象,但是我看不到如何阻止仅访问对象的某个字段。 在我的用例中,我想防止某些查询访问我的String中的field UserType

有可能吗?有field助手吗?

3 个答案:

答案 0 :(得分:0)

您可以在GraphQL-ruby中使用scoping或使用宝石graphql-guard

要进行作用域定义,您应该使用Pundit scope或CanCan accessible_by

仅供参考,我尚未在任何地方使用它,但似乎两者都可以解决您的问题。

答案 1 :(得分:0)

我使用了宝石graphql-guard

GUARD = lambda do |obj, args, ctx|
  ...some logics...
end

field :some_field, String, null: false, guard: GUARD

当我只想使用诸如lambda do |_, args, _|

之类的一些参数时

答案 2 :(得分:0)

这是一个例子:

module Types
  class User < Types::BaseObject
    field :private_string, String, null: true do
      def authorized?(object, args, context)
        # Do whatever logic you want and return true if the user is authorized.
        object.id == context[:current_user].id
      end
    end
  end
end

class MySchema < GraphQL::Schema
  # You'll need this in your schema to handle an unauthorized field.
  def self.unauthorized_field(error)
    raise GraphQL::ExecutionError, "The field #{error.field.graphql_name} on an object of type #{error.type.graphql_name} was hidden due to permissions"
  end
end