나는 인증이 당신이이 리소스에 액세스 할 수있는 질문에 대답해야한다는 인상을 https://github.com/elabs/pundit#scopesPundit에서`scope` 지향 동작 (특히`index` 동작)이 다르게 취급되는 이유는 무엇입니까?
나는에 관하여 쓰고 있어요?, 즉 true
/false
답. Pundit의 문서에 따르면 누가 묻는 지에 따라 ActiveRecord::Relation
의 값을 반환해야하는 index
을 제외한 모든 작업의 경우입니다. 일반 사용자가 scope.where(:published => true)
를 얻을 예를 들어, 관리자는 scope.all
을 가져옵니다.
응용 프로그램/정책/post_policy.rb
class Scope < Struct.new(:user, :scope)
def resolve
if user.admin?
scope.all
else
scope.where(:published => true)
end
end
end
응용 프로그램/컨트롤러/posts_controller.rb
def index
@posts = policy_scope(Post)
end
내 예약이 미끄러운 경사, 그리고 곧 나는 것입니다 범위 (예 : scope.all.order('created_at ASC')
)에 프레젠테이션을 추가해야합니다. 인증 정책에서 이상하게 느껴질 수 있습니다.
...
def index
@post = policy_scope(post)
if user.admin?
@post = @post.order('created_at ASC')
end
end
을 ...하지만은 컨트롤러의 일이? 그리고 저는 그러한 호출을 뷰에 추가하는 것이 옳다고 생각하지 않습니다. 아마 모델 방법이되어야할까요?
당신은 다음과 같은 일을하는 것에 대한 찬성/반대 의견이 무엇이라고 생각하십니까?
응용 프로그램/컨트롤러/posts_controller.rb이 authorize
하나의 호출 및 모델 메소드를 한번 호출, 단지 다른 방법 같은 index
유지
.
def index
authorize(Post)
@posts = Post.index(current_user)
end
응용 프로그램/정책/post_policy.rb
이 단순히 참/거짓 대답을 제공합니다. 당신은인가 받았습니까? 예 혹은 아니오.
def index?
user.admin? || user.regular_user?
end
응용 프로그램/모델/post.rb
그리고 모델에서 우리는 우리가 원하는만큼 화려한 얻을 수 있습니다.
def self.index(user)
if user.admin?
Post.all.order('created_at ASC')
else
Post.where(user_id: user.id)
end
end
생각 나게하기?
authorization
을 : 다음과 같이 학자의 범위 대 인증의
권한 부여는 사용자가 개별 리소스에 액세스 할 수있는 권한이 있는지 확인하는 것과 같습니다. 반면 범위 지정은 인덱스 동작에서 반환되는 내용을 필터링하기위한 것입니다. 즉, 범위 지정은 권한 부여처럼 403 금지 된 오류를 발생시키지 않습니다. 그것은 current_user가 소유하지 않은 레코드를 제거하는 데 사용됩니다. – Zhang
Pundit의 공식 github 페이지조차도 다음과 같습니다 :'def show @user = authorize User.find (params [: id]) end' https://github.com/elabs/pundit – Zhang