我正在尝试设置管理员角色系统,其中许多管理员具有不同的角色。我从两个角色开始:super_admin和:office_admin。
我希望:office_admin能够管理其他:office_admins,但不能管理:super_admins。我通过Ability文件完成了部分想法。
我的架构:
class Admin < ActiveRecord::Base
has_many :admin_assignments
has_many :admin_roles, :through => :admin_assignments
attr_accessible :name, :admin_role_ids
end
class AdminAssignment < ActiveRecord::Base
attr_accessible :admin_id, :admin_role_id
belongs_to :admin
belongs_to :admin_role
end
class AdminRole < ActiveRecord::Base
has_many :admin_assignments
has_many :admins, :through => :admin_assignments
attr_accessible :name
end
class AdminAbility
include CanCan::Ability
def initialize(admin)
if admin.role? :super_admin
can :manage, Admin
elsif admin.role? :office_admin
can :manage, Admin, :admin_roles => { :name => ['office_admin'] }
end
end
end
我的问题是我无法阻止办公室管理员为自己分配SuperAdmin的角色。这是我可以通过CanCan做的事情,还是我必须将部分授权逻辑推入ActiveRecord模型?