Pundit을 사용하여 GraphQL Rails에서 필드 인증 입력

4473 단어 railsgraphql
GraphQL-rails pundit integration의 PRO 기능을 가지고 있는데 방법론은 쉽지만 PRO 기능이고 유료입니다.

여전히 오픈 소스 버전에서 메서드authorized?를 제공하지만 수동으로 수행해야 합니다. 현장 인증here에 대해 자세히 알아볼 수 있습니다.

Pundit은 Rails 애플리케이션을 위한 훌륭한 객체 지향 인증입니다. 시스템의 현재 요구 사항에 따라 권한 부여 논리가 시간에 따라 변경될 수 있도록 권한 부여 논리를 컨트롤러에서 분리하는 데 도움이 됩니다.

현장 승인



GraphQL 레일에서 우리는 일부 필드가 모든 사용자가 아닌 일부 특정 사용자에게만 표시되기를 원합니다. 여기에서 우리는 성공하면 유형의 필드를 먼저 승인한 다음 유형에 따라 필드의 값을 표시하고 그렇지 않으면 nil .

나는 pundit gem이 확실히 GraphQL과 함께 코드에 설치되고 초기화되었다고 가정합니다.

사용자가 게시물을 가지고 있고 게시물의 소유자만 게시물의 조회수를 볼 수 있는 예를 들어 보겠습니다. 그러나 graphql에는 하나의 게시물 유형이 있으므로 소유자 이외의 사람이 해당 필드에 액세스할 수 있습니다. 따라서 게시물 소유자에게만 필드를 승인합니다.

# 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?는 참 또는 거짓을 반환합니다. 따라서 인증에 실패하면 nil가 표시되고 그렇지 않으면 값이 표시됩니다. 따라서 향후 owner? 정의를 변경해야 하는 경우 쉽게 수행할 수 있습니다. 또한 Pundit 정책에서 동일한 메서드 이름number_of_views을 생성하여 Pundit 정책에서 흐름을 완전히 제한할 수 있습니다.


행복한 코딩!

좋은 웹페이지 즐겨찾기