我正在进行角色/权限设置,但似乎无法按预期运行。
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这样的插件。但是,我确实对使用插件进行身份验证和授权这一点非常重要 - 如果它们停止运行会发生什么?谁对此有看法?
谢谢!
答案 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。