Panditを使用したGraphSQL Railsの型フィールド認証


GraphQL-rails  プロの機能pundit integration 簡単な方法論がありますが、そのプロの機能と有料.
それでも提供するauthorized? オープンソースバージョンのメソッドですが、手動で行う必要があります.フィールド承認についてもっと学ぶことができますhere .
Pundit Railsアプリケーションのための大きいオブジェクト指向の認可です.認可論理がシステムの現在の要件に従って時間とともに変更されることができるように、それはコントローラから認可論理を切り離すのを助けます.

フィールド認可


Graphical Railsでは、いくつかのフィールドをすべてのユーザではなく特定のユーザにしか表示しないようにします.ここでは、成功した場合は、フィールドの値をタイプに応じて最初に表示しますnil .
私は、Pundit宝石がインストールされて、あなたのコードに間違いなくGraphqlとともに初期化されると仮定します.
ユーザーがポストを持っている例を取りましょう、そして、ポストの所有者だけはポストの上で見解の数を見ることができます.しかし、GraphSQLのポストタイプを持っているので、所有者以外の人々はその分野にアクセスできます.それで、我々はポストの所有者のためにフィールドを認可しています.
# app/policies/post_policy.rb
class PostPolicy < ApplicationPolicy

  # only if user is the owner of the post
  def owner?
    user.present? && record.user == user
  end

  class Scope < Scope
    def resolve
      scope.all
    end
  end
end
ポストポリシーを所有者ロールで定義したので、ビュー型のフィールド認証のポスト型を定義します.
# app/graphql/types/post_type.rb
module Types
  class PostType < Types::BaseObject
    field :id, ID, null: false
    # .... remaining fields
    field :number_of_views, Integer, null: true, description: 'number of times user has viewed your post' do
      def authorized?(object, args, context)
        Pundit.policy(context[:current_user], object)&.owner?
      end
    end

    # resolvers
    def number_of_views
      object.views.count
    end
  end
end
authorized? trueまたはfalseを返します.したがって、承認が失敗するならnil その他の値が表示されます.もしそうならばowner? 定義はそれを簡単に行うことができます変更する必要があります.また、同じメソッド名を作成できますnumber_of_views pundit方針で完全に制限を制限する方針で.
ハッピーコーディング!