2012-01-28 3 views
0

나는 액세스 제어 패턴이 페이스 북 그래프 API와 매우 유사한 공개 API를 사용하여 서비스를 구현하려고합니다. 나는 Devise로 OAuth를 수행 할 수있는 문지기 보석을 사용하고 토큰에 액세스 할 수있는 권한/범위를 쉽게 제공합니다.Rails에 대한 역할 기반 액세스 제어 (oauth-) 방법은 무엇입니까?

그래서 넘어, 내가 필요 : - 액세스 제어를 액세스 토큰 의 범위에 따라 - (페이스 북에서 개인 정보 보호 설정과 같은) 플랫폼에서 다른 그룹 사용자에 대한 액세스 제어 - 액세스 제어 동적이어야한다 , can not는 고정 된 역할을 맡습니다.

아니요 저는 역할 기반 액세스 제어를하는 것으로 보이는 CanCan을 보았습니다.하지만 OAuth를 매우 쉽게 incoorperate하는 것처럼 보이지 않으므로 롤업하는 것이 가장 좋은지 스스로에게 묻습니다 내 자신의 시스템을 밖으로? 기본적으로 모델에 대한 모든 액세스 제어를 기본적으로 수행하는 것이 올바른 방법일까요?

다른 의견이 있으십니까?

+0

CanCan은 귀하의 필요를 어떻게 처리하지 않습니까? 나는 OAuth에 익숙하지 않지만 작동하지 않을 이유를 생각할 수 없다. – Max

+0

필자가 조사한 바에 따르면 CanCan은 매우 전통적인 RBAC에 대해 범위가 지정됩니다. 잠재적으로 모든 사용자를 대상으로 동적 범위 지정을 원하기 때문에 적어도 그룹화 할 수는 없습니다. (적어도 cancan에 대한 내 이해가 있습니다.) – nambrot

+0

"동적 범위 지정"이 의미하는 바에 대해서는 약간 확신 할 수 없습니다. – Max

답변

0

CanCan이 원하는 것을 처리 할 수 ​​있다고 생각합니다. 사용자가 권한을 부여한 것으로 간주되는 사항에 대해 구체적인 내용을 제공하지 않았으므로 도움이 될만한 몇 가지 방법을 알려 드리겠습니다. 제가 먼저 말하고자하는 것은 여러분이 능력 파일에 원하는 모든 객체를 전달할 수 있다는 것입니다. 이를 수행하려면 다음을 수행 : 응용 프로그램에서

def ApplicationController < ActionController::Base 
    def current_ability 
    @current_ability = CustomAbility.new(pass, in, anything, here) 
    end 
end 

/모델을 당신이 때 custom_ability.rb 정의 할이 경우

def CustomAbility 
    include CanCan::Ability 

    def initialize(anything, you, want, here) 
    ... 
    end 
end 

를, 아무것도 = 당신이 = 통과 = 무엇을 원하는 , 여기 = 여기. 또한 권한을 부여하는 리소스에 대해 몇 가지 메서드를 호출 할 수 있습니다. CanCan은 @resource_name을로드 한 다음 승인 할 능력 파일을 입력하여 작동합니다. RESTful 라우트를 가정하여 @resource_name을로드하지만, @ resource_name에 저장하면 (즉, 사용자를 @user에 저장하는 경우) before_filter를 사용하여 쉽게 자신의 리소스를로드 할 수 있습니다.

이미 생성 된 매개 변수를 인증하는 개체에서 특정 메서드를 호출 할 수도 있습니다. 예를 들어, 다음과 같이 할 수 있습니다.

def initialize(user) 
    can :read, Post do |post| 
    !((post.readable_groups & user.groups).empty?) 
    end 
end 

기본적으로 해당 블록의 행이 false를 반환하면 권한이 부여되지 않습니다. 유일한주의 사항은 블록이 create 또는 new에서 실행되지 않는다는 것입니다. 이 문제를 해결하는 방법이 있습니다. 예를 들어 고유성 검증을 사용하여 모델 수준에서 사용자 당 하나의 게시물을 시행한다고 가정 해 보겠습니다. 이전 필터를 사용하여 post_user_id 설정을로드 한 다음 수행하십시오.

can :create, Post, valid?: true 

어쨌든 도움이 되셨을 것입니다.

+0

내가 가질 수있는 유일한 질문은 다음과 같습니다. 초기화하기 위해 전달한 인수에 따라 Post의 특정 속성을 어떻게 표시 할 수 있습니까? 내가 모든 데이터를 볼 수 있도록 관리자를 원하지만 손님은 예를 들어 게시물의 발췌문 만 볼 수 있습니까? – nambrot

+0

일반적으로 CanCan의 액션은 컨트롤러 액션에 해당합니다.하지만 액션을 임의로 정의 할 수 있다고 생각합니다. 예를 들어'can : read_part, Post # Hash 또는 조건 블록을 여기에 넣을 수 있다고 생각합니다. '그리고 나서 여러분은'<% if can? (: read_part, @post) %>라고 말할 수 있습니다. '등 – Max

관련 문제