2014-01-16 1 views
9

나는 인증당신이이 리소스에 액세스 할 수있는 질문에 대답해야한다는 인상을 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을 : 다음과 같이 학자의 범위 대 인증의

답변

11

나의 이해는 '이 사용자가 (파괴// 업데이트를 만들 수)이 자원에 행위를 허용?'

within scope :'이 사용자는 (색인/표시)이 리소스를 볼 수 있습니까? '

답변 (authorize @resource)은 permitted_attributes에서 대답은 ResourcePolicy입니다.

범위 (policy_scope(Resource))는 resolve입니다.

Pundit의 범위에 대한 추론은 코드에 누가 어떤 리소스에 액세스해야하는지 정의해야하는 위치가 하나만 있어야한다는 것입니다.

앞서 설명한 것처럼 컨트롤러 또는보기에서 동일한 동작을 구현할 수 있습니다. 그러나 정책에 코드를 삽입하면 컨트롤러 메서드 중 하나에서 적절하게 범위를 지정하는 것을 잊어 버리면 무단 액세스를 방지 할 수 있습니다.

가시성을 제한하는 방법으로 policy_scope()을 생각하고 있지만 다른 결과 세분화 (예 : 정렬)는 컨트롤러 수준에서 수행 할 수 있습니다. 그러나 개인적인 취향에 대해서는 의심의 여지가 없습니다.

+0

권한 부여는 사용자가 개별 리소스에 액세스 할 수있는 권한이 있는지 확인하는 것과 같습니다. 반면 범위 지정은 인덱스 동작에서 반환되는 내용을 필터링하기위한 것입니다. 즉, 범위 지정은 권한 부여처럼 403 금지 된 오류를 발생시키지 않습니다. 그것은 current_user가 소유하지 않은 레코드를 제거하는 데 사용됩니다. – Zhang

+0

Pundit의 공식 github 페이지조차도 다음과 같습니다 :'def show @user = authorize User.find (params [: id]) end' https://github.com/elabs/pundit – Zhang

관련 문제