Rails用户 - >角色 - >权限设置

时间:2011-02-11 14:38:51

标签: ruby-on-rails authorization

我正在进行角色/权限设置,但似乎无法按预期运行。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为你最好使用CanCan来实现角色认证等。

但是如果您仍想从用户模型访问“权限”,我猜您可以在用户模型中执行此操作:

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

虽然没有测试过。

您也应该检查this

相关问题