레일즈의 인정 젬'펀디트'를 통해 빠짐없는 인정 설정 팁을 잘 만들 수 있습니다.
11622 단어 Rails
주의사항: Pundit에서
current_user
(로그인 중인 사용자 취득) 방법을 사용하기 때문에 사전에 Devise Gem 등'인증체제'에 가입해야 한다.Pundit의 개요
pundit
을 설치한 후 ApplicationController
에Pundit
펀디트를 사용할 준비를 한다.( 창고 참조 ) class ApplicationController < ActionController::Base
include Pundit
end
이름이 기재된 에만 접근할 수 있습니다.
# app/policies/dog_policy.rb
class DogPolicy < ApplicationPolicy
# 必ずtrueかfalseを返すメソッドにする
# recordにはデータ(対象となるDogインスタンス)が自動で入る
# userはcurrent_userが自動で入る
def show?
dog_owner = record.owner
record.name? && (dog_owner == user || dog_owner.friend?(user))
end
end
include
에서 호출한다.class DogsController < ApplicationController
def show
# ログインユーザーがアクセスできるのかチェック
@dog = authorize Dog.find(params[:id])
end
end
authorize
에서 호출된 동작 이름과 모델 이름에서 자동으로 정책 방법을 선택해서 응용하는 것이다.authorize
모델에 대한 Dog
동작 내 호출"이기 때문에 자동으로 선택show
한다.주의해야 할 것은
DogPolicy#show?
가 되돌아오면show?
authhorize는false
raise가 발생하기 때문에Pundit::NotAuthorizedError
등 오류를 줍고 403로 되돌아오는 메커니즘을 구축해야 한다는 것이다.# app/controllers/application_controller.rb
unless Rails.env.development?
rescue_from Pundit::NotAuthorizedError, with: :render_403
end
def render_403
# 中身は各自に任せる
render template: 'pages/403', status: 403
end
Pundit 를 사용할 때 주의해야 할 점
# app/policies/dog_policy.rb
class DogPolicy < ApplicationPolicy
# 必ずtrueかfalseを返すメソッドにする
def show?
dog_owner = record.owner
record.name? && (dog_owner == user || dog_owner.friend?(user))
end
end
이거, 분석을 해보면 두 부분으로 나뉘어요.
이런 사태의 발생을 방지하기 위해서는 우선
예제
나는 좀 복잡한 예를 하나 생각한다.
class DogPolicy < ApplicationPolicy
def show?
record.name?
end
end
class DogPolicy < ApplicationPolicy
def show?
return false unless record.name?
dog_owner = record.owner
dog_owner == user || dog_owner.gave_license_to?(user)
end
end
class DogPolicy < ApplicationPolicy
def show?
return false unless record.name?
dog_owner = record.owner
return true if dog_owner == user || dog_owner.gave_license_to?(user)
record.is_public?
end
end
총결산
Reference
이 문제에 관하여(레일즈의 인정 젬'펀디트'를 통해 빠짐없는 인정 설정 팁을 잘 만들 수 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Coolucky/items/9dfdebf920c2b31f13c9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)