2011-02-11 2 views
1

역할/권한 설정을하고 있지만 의도 한대로 작동하지 않습니다. 내가 좋아하는 것이 무엇레일 사용자 -> 역할 -> 권한 설정

class User < ActiveRecord::Base 

    has_and_belongs_to_many :roles, :join_table => "users_roles" 
    has_many :permissions, :through => :roles 


class Role < ActiveRecord::Base 

    has_and_belongs_to_many :users 
    has_and_belongs_to_many :permissions, :join_table => "roles_permissions" 


class Permission < ActiveRecord::Base 

    has_and_belongs_to_many :roles 

내 사용자 개체 (user.roles, user.permissions)에서 직접 역할 및 권한에 액세스 할 수 있습니다.

user.roles가 작동하지만 user.permissions가 작동하지 않는 것 같습니다. 나를 도울 수있는 사람이 있습니까?

또 다른 방법은 Devise + CanCan과 같은 플러그인을 사용하는 것입니다. 그러나 플러그인을 인증 및 권한 부여처럼 필수적으로 사용하는 것에 대한 우려가 있습니다. 플러그인을 중단하면 어떻게 될까요? 이것에 대한 전망이있는 사람은 누구입니까?

감사합니다.

+2

CanCan과 함께 가고 싶습니다. 오픈 소스이기 때문에 Ryan Bates가 작업을 중단하더라도 누군가 다른 사람 (아마도 당신)이 할 수 있고 아마도 그렇게 할 수 있습니다. 번거롭지 않고 원하는대로 정확하게 작업 할 수 있습니다. – polarblau

+0

CanCan 또는 Authlogic과 함께 할 수 있습니다. 그들이 중단 된 경우, 당신은 항상 그것을 포크 수 있습니다. –

답변

0

난 당신이 역할 등

을 가진 인증을 달성하기 위해 캉캉를 사용하여 더 나을 거라고 생각하지만 여전히 사용자 모델에서 "권한"액세스하려는 경우, 당신은 사용자 모델과 같이 할 수있는 추측하고있다 :

def permissions 
    Permission.find(:all, :joins => {:roles => :users}, :conditions => ["users.id = ?", self.id]) 
    end 

테스트하지 않았습니다.

this도 확인해야합니다.

1

캔 캔은 승인입니다. Authlogic 및 Devise는 인증입니다. 권한 부여 및 인증은 웹 응용 프로그램의 두 가지 다르지만 일반적으로 관련된 측면입니다.

has_many :through을 사용하여 has_and_belongs_to_many 연결을 참조 할 수 없다는 느낌이 들었습니다. 나는 has_many :throughhas_many 연결을 참조해야한다고 생각합니다. 나는 결정적인 정보를 발견 할 수 없었다. 어쩌면 다른 사람이 알고 있을까요?

Devise와 Authlogic 모두 잘 작동하고 확장하기가 쉽기 때문에 (내 생각 엔 특히) 내 자신의 인증을 롤업하지 않습니다. 보안 해싱에 대한 모범 사례가 기본 제공됩니다. OpenID 및 Facebook 인증은 간단한 애드온입니다. 왜 바퀴를 다시 발명합니까? 최악의 경우 미래에 언젠가는 지원이 중단됩니다. 내게는 아직 소스 코드가 있기 때문에 그다지 큰 문제가 아니므로 느슨해 질 것이없고 모든 것을 얻을 수 있습니다.

권한이 필요하지 않은 경우 동적 일 수 있습니다. 특정 역할의 사용자가 수행 할 수있는 권한을 CanCan 기능 파일에 하드 코딩합니다. 저장하려는 추가 메타 데이터가 없으면 역할에 대해 데이터베이스 테이블이 필요하지 않을 수도 있습니다. 대부분의 응용 프로그램에서는 결국 추가 데이터가 조인 테이블과 연결되어야하기 때문에 has_and_belongs_to_many 연관을 피하는 것이 좋습니다. 이것은 고려해야 할 하나의 해결책이 될 것입니다. 같은 일을 성취하는 데 더 간단하고 복잡한 방법이 있습니다.

class User < ActiveRecord::Base 
    has_many :roles 
end 

class RoleAssignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
end 

class Role < ActiveRecord::Base 
    has_many :role_assignements 
    has_many :users, :through => :role_assigments 
end 

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    if user.roles.include? Role.find_by_name('admin') 
     can :manage, :all 
    else 
     can :read, :all 
    end 
    end 
end 
관련 문제