2009-11-27 4 views
4

모델 유효성 검사와 비슷한 방식으로 모델 레벨 (컨트롤러 아님)에서 레일즈 애플리케이션의 권한을 구현하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?레일즈에서의 모델 레벨 인증

모델 자체에서 구현되는 경우 주요 문제는 모델이 현재 사용자에게 액세스 할 수 없다는 것입니다. 나는 같은 솔루션을 보았다 : Thread.current[:user_id] = session[:user_id],하지만 그건 좋은 생각 같지 않아.

나는 create, find 및 new와 같은 메소드의 변형이 작성되어 현재 사용자에 대한 추가 매개 변수를 허용하는 다른 접근 방식을 보아 왔습니다.

또 다른 방법은 예를 user.posts.create 또는 user.readable_posts.find 대신 Post.create 또는 Post.find으로 사용되는, 그래서 사용자/역할 클래스의 모든 메소드를 구현하는 것입니다.

이러한 접근법 중 어느 것을 제안 할 것입니까? 승인을 구현하는 더 좋은 방법이 있습니까? 이것을 쉽게 만드는 플러그인이 있습니까? 여러 역할과 모델에 맞게 확장 할 수있는 접근 방식이 필요합니다.

답변

1

난 당신이 declarative authorization보고 추천 할 것입니다. 그것은 모델과 컨트롤러 모두에서 작동합니다.

요청하는 방식은 승인이 모듈 인 Authorization.current_user = current_user을 설정하는 applicationController에 before_filter가있는 것입니다.

나는 접근 방식이 가장 좋습니다. 모델을 깨끗하게 유지하고 사용자를 사방에 포함시키지 않아도되지만 대신 모델 콜백 함수에서 필터링 할 수 있습니다.

+0

이 방법을 사용하면 콘솔 (또는 컨트롤러를 통과하지 않는 다른 방법)의 요청이 어떻게 처리됩니까? – Ralf

+0

내 의견에 대한 대답을 찾았습니다. Authorization :: Maintenance에는 이에 대한 기능이 있습니다. 언뜻보기에 declarative_authorization은 필자가 요구 한 일부 기능을 놓친 것처럼 보였지만, 더 깊게 보았을 때 나는 그것이 매우 강력하다는 것을 알았습니다. 나는 모든 권한을 별도의 파일로 지정할 수있는 것을 좋아합니다. – Ralf

+0

그래, 그걸로 꽤 잘 작동 해. 대부분의 로직은 애플리케이션에서 제외됩니다. 그리고 사용자가 할 수있는 일을 나열하는 대신 무언가를 할 수 있는지 실제로 확인하는 방식을 좋아합니다. 청소기가 느껴집니다. –

0

왜 이렇게할까요? 컨트롤러 레벨 식별이 충분하지 않습니까?

if @user.is_able_to_do_this? 
    do_this 
else 
    blah! 
end 

... 당신의 모델은

def is_able_to_do_this 
    if self.rights > Constant::Admin_level_whatever 
    return true 
    end 
    return false 
end 
+0

매우 복잡한 권한 시스템이 있기 때문에 주로 더 복잡한 작업을 수행 할 수 없거나 수행 할 수 없습니다. 예를 들어, 특정 사용자는 모델의 특정 속성 만 편집 할 수 있어야합니다. – Ralf

+0

모델의 동일하거나 유사한 조치가 여러 컨트롤러에서 참조되는 경우 더 간단합니다. – Ralf

+0

알겠습니다. 이 경우 jimmy의 대답은 좋은 옵션이어야한다고 생각합니다. – marcgg