2017-12-26 69 views
1

내 응용 프로그램에 Devise 보석을 설치했습니다. 나는 또한 내 애플 리케이션에 여러 게시물 모델이 있습니다. 예를 들어 다양한 마이크로 포스트 모델에서 '농구', '야구'및 '축구'에 대해 토론 할 수있는 포스트 모델이 있습니다.인증 : 게시 모델에 대한 액세스를 제한하거나 부여하기 위해 Devise 가입 자격 증명을 사용할 수 있습니까?

그러나 특정 사용자가 Devise에 가입 ​​할 때 제공 한 정보를 기반으로 특정 모델에 게시하는 것을 제한하고 싶습니다. 예를 들어 Basketball 모델에 게시하려면 우편 번호 04583, 34039 또는 49492를 제공해야합니다. 그렇지 않은 경우 사용자는 게시 할 수 없습니다.

이것이 가능합니까? CanCan 보석으로 원래 가능하다고 생각하지만 지금은 불확실합니다.

감사합니다.

답변

2

인증인증을 혼동하지 않도록주의하십시오. Devise는 인증에 사용됩니다. 즉 사용자는 자신이 말하는 사람입니다. 당신이 원하는 것은 특정 사용자가 특정 일을 할 권한을 부여하는 것입니다.

깡통 보석 이었습니다.하지만이 작업을 수행하는 가장 좋은 방법은 cancancan으로 대체되었으므로 원하는 작업을 정확하게 수행 할 수 있습니다. 이것이 어떻게 수행되는지 더 잘 이해할 수 있도록 능력을 정의하는 것에 관해서는 wiki을 확인하십시오.

귀하의 권한 부여 방법은 Devise와는 완전히 독립적이지만 가입 양식을 통해 획득 한 경우에도 원하는 사용자의 속성을 계속 사용할 수 있습니다.

+0

예를 들어 승인하려는 우편 번호가 여러 개있는 경우이를 수행 할 수 있습니까? 답변 주셔서 감사합니다. 나는 CanCanCan이 갈 길이라고 생각하고 있었지만 그것이 최선의 방법인지 확실하지 않았습니다. –

+0

예, 위키를 보면 필요한 논리가 무엇이든 사용할 수 있습니다. User 인스턴스에 액세스 할 수 있으므로 모든 속성과 관계를 사용할 수 있습니다. Cancancan은 훌륭하게 작동하지만, [Pundit] (https://github.com/elabs/pundit)에서 다른 예를 확인할 수도 있습니다. –

+0

도움을 주셔서 감사합니다. –

0

먼저 인증/승인은 모델이 아닌 컨트롤러에서 수행됩니다. 적절한 MVC 아키텍처에 따라 모델은 누가 누군지를 신경 쓰지 않습니다.

def require_whatever_privilege 
    unless <whatever your criteria is> 
    # Option 1 – Raise a routing error: 
    raise ActionController::RoutingError.new("You don't have access to this!") 

    # Option 2 – Render a 403 page, if you have one: 
    return render file: 'public/403.html', status: :forbidden 
    end 
end 

그런 다음, 당신은 단순히 당신이 원하는대로 컨트롤러에 필터를 추가 할 수 있습니다

, 당신은 ApplicationController이 뭔가를 추가 할 수 있습니다 (I 이미 인증을 처리했습니다 있으리라 믿고있어) 인증을 추가하려면 에서 사용하기 :

before_action :require_whatever_privilege 

또는 당신은 단지 컨트롤러의 특정 방법에 대한 필터를 사용하려는 경우, 당신은 같은 것을 할 수있는 :