2016-11-10 4 views
0

저는 Pundit gem을 사용하여 current_user 이외의 사용자에게 속한 색인 페이지에 대한 액세스를 방지하는 방법을 알아 내려고 노력하고 있습니다.Pundit Gem 색인 페이지 액세스 금지

예제는 current_user로 결과를 범위 지정하는 방법에 대해서만 설명하지만 current_user가 레코드의 소유자가 아닌 경우 실제로 페이지 자체에 대한 액세스를 실제로 금지하는 방법은 없습니다.

어떤 도움을

감사

+0

나는 색인 페이지가 어떤 사용자에게도 속하지 않는다고 생각할 것이다. 관리자에게만 액세스를 제한하는 것이 목표입니까? – moveson

+0

@moveson 특정 사용자의 색인 페이지입니다. 페이지가 있습니다. 아마도 그것은 인덱스 페이지가 아니라 user_posts와 같은 사용자 컨트롤러에서 별도의 작업이되어야합니다. – Robbo

+0

그것은 나에게 더 이해할 수 있습니다. 아래에 설명 된 패턴이 작동해야합니다. 'index? '를'user_posts?'로 대체하면됩니다. 'authorized_to_edit? '논리를 어디에 둘 것인지에 대한 대안을 제시하기 위해 @Fede Bonisconti의 코멘트를보십시오. 사용자 모델이 아닌 다른 곳에 포함 시키려면'current_user.authorized_to_edit' 대신'authorized_to_edit? (current_user)'를 호출해야합니다. – moveson

답변

1

은 아마 당신이 뭔가를 원하는 감사? (클래스 MODELNAME 용)

# /policies/model_name_policy.rb 

class ModelNamePolicy 
    attr_reader :current_user, :resource 

    def initialize(current_user, resource) 
    @current_user = current_user 
    @resource = resource 
    end 

    def index? 
    current_user.authorized_to_edit?(resource) 
    end 

end 

# /models/user.rb 

class User < ActiveRecord::Base 

    def authorized_to_edit?(resource) 
    admin? | (id == resource.created_by) # Or whatever method you want to call on your model to determine ownership 
    end 

end 

편집 : 당신은 또한 정책을 호출하는 컨트롤러에서 authorize를 호출 할 필요가 있습니다.

+0

IMO : Pundit의 아이디어는 모델 내에 권한 논리를 포함시키지 않는 것입니다. –

+0

다른 제안이 있습니다. 'authorized_to_edit? '가 많은 모델의 정책에서 사용된다면, 어디에 두겠습니까? – moveson

+0

'authorize_to_edit'가 각 정책에 대해 각 정책에 정의되어야합니다. 모델 중 일부가 동일한 인증 로직을 공유하는 경우 중복 코드를 피하기 위해 클래스/믹스 인을 사용할 수 있습니다. –