Авторизация по полю в graphql-ruby

Из этого гид я не понимаю, как мы можем добавить авторизацию на поле в graphql-ruby.

Я понимаю, как мы можем запретить доступ ко всему объекту, но я не понимаю, как мы можем запретить доступ только к полю объекта. В моем случае я хочу, чтобы некоторые запросы не обращались к Stringfield в моем UserType.

Является ли это возможным? С помощником field?

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
6
0
1 473
3

Ответы 3

Вы можете использовать определение объема в GraphQL-ruby или использовать gem graphql-охранник.

Чтобы область видимости работала, вы должны использовать либо Pundit объем, либо CanCan доступный_by.

К вашему сведению, я еще нигде не использовал его, но кажется, что оба могут решить вашу проблему для меня.

Я использовал гем graphql-охранник.

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

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

И когда я хотел использовать только некоторые аргументы, такие как lambda do |_, args, _|

Вот пример:

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

Другие вопросы по теме