2013-04-19 3 views
4

안녕하세요, 저는 rolify를 사용하고 있습니다. 실제로 그것을 최대한 활용하고 있지 않다는 것을 깨달았습니다.Rolify의 목적은 무엇입니까?

현재

내가 다시 라우팅 사용자의 경우 current_user.has_role? :whatever_role처럼 내 컨트롤러에서 일을하고, 그들이 어떤 다른 역할이있는 경우 사용자를 허용하고 ...

누군가가 rolify에 대한 유래에 대한 질문을하고 난에 도착했을 때 대답을하려고하면, 내가 잘못하고 있다는 것을 깨달았습니다. 이제

user ||= User.new # guest user (not logged in) 
if user.has_role? :consumer 
    can :manage, Review 
else 
    can :read, Review 
end 

을이 전 사용자에게 소비자 역할을 추가 가정 해 봅시다 :

x=User.last 
x.add_role :consumer 
# => #<Role id: 10, name: "consumer", resource_id: nil, resource_type: nil, created_at: "2013-04-18 23:00:46", updated_at: "2013-04-18 23:00:46"> 

마우스 오른쪽 단추로 내 혼란이 시작되는 지금

, 여기에 내가 가진 ability.rb의 내부입니다 ... 그래서 역할이 만들어집니다. 나는 수행하여이 문제를 확인할 수 있습니다 내가 제품을하려고 여기에 ... ...

x.has_role? :consumer 
=> true 

지금이 리뷰에 대한 관리 기능을 제공 할 것으로 예상하는 다른 모델에 대한

x.has_role? :consumer, Review 
=> true 

하지만를

x.has_role? :consumer, Product 
=> true 

"리소스 역할 쿼리"를 검토하고 적용된 역할에 대한 검토를 시도 할 때 적용되는 역할은 없습니다.

Review.first.applied_roles 
=> [] 

누군가 내게 설명해 줄 수 있습니까? this reddit post:

인증에서 질문을 차압 감사

+0

나는 질문의 출처로 reddit을 좋아하지만 ** ** stackoverflow는 답변의 ** 신뢰할 수있는 출처 **입니다. 그래서 저는 모든 사람들이 더 쉽고 빠르게 찾을 수있는 질문을 복습했습니다. 그리고 [reddit에 내 대답을 올렸습니다] (http://www.reddit.com/r/rails/comments/1cn4ra/can_someone_please_explain_the_abilityrb_file/c9i7s55). reddit에서 내 대답이 그에게 호의적이지 않은 것으로 보이는 경우 여기에서 대답에 대한 더 나은 응답에 링크 한 다음 닫습니다. 그렇지 않으면, 나는 그의 질문이 여기에 응답되기를 원할 것이다. 나는 그 다음에 내가 reddit에 전달할 것이다. –

답변

27

내 대답은 User가 자신이 주장하는 것입니다 결정하는 것입니다.

인증은 신원을 확인한 후 읽기 또는 쓰기로 주어진 동작을 수행 할 수 있음을 입증합니다.

역할 사용자에서 인증 단지 일반적인 패턴입니다 :이 UserUser이 대신 같은 권한이 부여 될 수 있다는 등의권한을 부여 할 수 있습니다.

여기에서 누락 된 성분은 입니다. 허가 : 설립 된 Role과 일부 컨트롤러 조치 사이의 관계.

RolesUser이 수행 할 수있는 작업에 대해 약속하지 않습니다. 그리고 기억하십시오 - 승인은 모든 행동에 관한 것입니다. Roles은 어떤 종류의 User을 다루고 있는지 일반화합니다. 그들은 User에 대해 Permissions이라는 거대한 세탁물 목록을 쿼리하지 않아도됩니다.신고하는 사람 : UserRole입니다. 물론 그들은 그것을 할 Permission 있습니다!

Permission에는 여러 가지 유형이 있습니다. 충분히 을 Users으로 편집 할 수 있도록하려면 해당 데이터베이스를 편집 할 수 있도록하려면 Roles과 함께 데이터베이스에 저장할 수 있습니다. 당신의 User'sRoles 충분히 정적 경우 또는, 당신은 루비 코드를 사전에 Permissions을 관리 할 수 ​​있습니다

  • 내가 설정해야 할 때 RolesPermissions, 당신이 누군가에 떨어져 전달하고 클라이언트 응용 프로그램 즉, 계약 완료 후 User :has_many RolesRole :has_many Permissions을 내 맞춤 모델과 함께 구현 한 다음 ApplicationControllerbefore_filter :authorize 후크를 추가하고이 기대치를 충족시키는 방법을 알고 있거나 그 사람들을 위해 403 페이지를 렌더링하는 방법을 authorize 방법으로 작성합니다. 사람들이 노출되기를 바라는 것에 수동으로 URL을 입력하도록 요구합니다. actions 그들에게 접근 할 수없는 것들.

  • Roles을 구성하고 싶을 때 나는 Ryan Bates' CanCan gem을 사용합니다.

  • 제가 PermissionsRoles과 소정 갖고 싶어

    는, I는 인증 자 클래스를 통해 쾌적가요 클래스 기반 Permissions를 얻기 위해, Nathan Long's Authority과 함께 Rolify를 사용한다.

모두 Roles

Permissions이 될 수 있습니다 클래스 기반 또는 사용 사례에 따라, 예를 기반. 예를 들어 방금 발견 한 rolify의 능력으로 특정 인스턴스 기반 상황에서 UsersRole으로 작용할 수 있다고 결정할 수 있습니다. 또는 RolesUser 일 경우 동작을 수행 할 수 있습니다. 동작을 시도하는 객체가 주어진 경우은 특정 유형입니다.

수식 다음, 블로그 응용 프로그램을 가정, 이들의 순열을 탐색하려면

User/Roleclass/instanceaction A/AN/모든/모든 것을/(class/instance) Permission :

  • Role 클래스와 Permission 클래스 :

    User 누구입니까 Admindelete 어떤 Post입니다.

  • Role 클래스와 Permission 예 :

    게시 된 게시물은 User ID를 가리키는 approved_by 필드를 한 경우 Adminedit 모든 Posts that they approved to be published

    이 쉽게 될 수 인 User. (상황이 이런 종류의 state machinegem를 사용

  • Role 인스턴스와 Permission 클래스 :.

    상황이 이런 종류가 드문 것을 어떤 Post

    참고 an Author of a PostcommentUser하는 RolifyAuthority과 같은 미리 정해진 상황을 관리하는 기능을 제외하고는이 상황을 처리하기 위해 위에서 언급 한 보석이없는 이유입니다. 또는이 결정을 사용자의 cl ient, 사용자 정의 솔루션.

  • Role 인스턴스와 Permission 예 :

    an Author of a Postedit 것을 PostUser.

TL; DR :

  • Rolify 역할만을위한 : 컨트롤러 액션 액세스 : Permission 의해 Users 그룹핑. Permissions을 어떻게 관리할지 아직 결정하지 않았습니다. 나는 희망

인증인증의 웅대 한 계획에 Rolify의 위치를 ​​이해하는 데 도움이!

+0

오, 알 겠어! 좋은 작업. – Abram

+0

"Rolify가 역할만을위한 것"이라면 - 그것을 사용하는 것이 무엇입니까? Devise + CanCanCan을 사용하고 user.rb'def admin에서 수동으로 정의 하시겠습니까? admin end' 다음에 ability.rb : 'if user.admin? can : manage, : 모두 else can : read, : all ' – prograils

+1

@prograils 인증 코드를 작성하는 방법에 따라 다릅니다 (Devise는 거의 인증입니다). CanCanCan은 사용 권한 라이브러리이며 Rolify와 잘 어울립니다. 'user.admin? '메소드의 출처는 스스로에게 물어야합니다. 처음에는 사용자의 부울 속성 일 수 있습니다. 비 - 바이너리 롤 시스템으로 성장하면 모델에 수많은 부울 플래그가 생깁니다. 사용자가 많은 역할을 수행 할 수 있다면 수표는 복잡해질 수 있습니다. Rolify를 사용하면'user.has_role?: admin'과 진화하는 복잡성을 깨끗하게 처리합니다. –