2011-02-11 21 views
1

我正在处理角色/权限设置,但似乎无法按预期工作。Rails用户 - >角色 - >权限设置

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一起去的。它是开源的,即使瑞恩贝茨停止了它的工作,其他人(也许你)可以也可能会这样做。它确实是你想要的而没有麻烦。 – polarblau 2011-02-11 15:07:41

回答

0

我想你会更好使用惨惨实现与角色等

认证,但如果你仍然想从用户模型访问“权限”,我猜你可以在用户模式做这样的:

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

虽然没有经过测试。

您应该检查this了。

1

CanCan针对授权。 Authlogic和Devise用于认证。授权和身份验证是Web应用程序的两个不同但通常相关的方面。

我有一种感觉,你不能使用has_many :through来引用has_and_belongs_to_many关联。我认为has_many :through必须引用has_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