我看过 declarative_authorization、CanCan 和 CanTango。他们都擅长向应用程序添加授权,但我想知道如何将授权添加到模型的特定实例,即一个人可以在一个项目中拥有管理访问权限并且只有有限(阅读少于管理:有限更新等)在另一个。
你能请一个更好的方法吗?如果我的问题听起来太琐碎,请道歉。可能是因为我是 RoR 的新手。
谢谢,约翰
我看过 declarative_authorization、CanCan 和 CanTango。他们都擅长向应用程序添加授权,但我想知道如何将授权添加到模型的特定实例,即一个人可以在一个项目中拥有管理访问权限并且只有有限(阅读少于管理:有限更新等)在另一个。
你能请一个更好的方法吗?如果我的问题听起来太琐碎,请道歉。可能是因为我是 RoR 的新手。
谢谢,约翰
我知道 CanCan 和 declarative_authorization,并且我用这两者实现了基于角色的授权,我推荐 CanCan。只是我的两分钱。
示例(未经测试,不幸的是我无法在这里测试,也无法访问我的代码)
假设我们有这样的结构:
class User < ActiveRecord::Base
belongs_to :role
end
class Role < ActiveRecord::Base
has_many :users
# attributes: project_read, project_create, project_update
end
然后,CanCan 可能看起来像这样:
class Ability
include CanCan::Ability
def initialize(user)
@user = user
@role = user.role
# user can see a project if he has project_read => true in his role
can :read, Project if role.project_read?
# same, but with create
can :create, Project if role.project_create?
# can do everything with projects if he is an admin
can :manage, Project if user.admin?
end
end
您可以在 github 上的 CanCan wiki 中找到您需要的所有信息。个人推荐阅读:
基本上,您只需要扩展上面的示例以通过您的关系包含您的角色。为了简单起见,您还可以在ability.rb
.
您可能会遇到的主要警告(至少我这样做):确保您的用户可以使用模型做某事,然后再定义用户不能做的事情。否则你会坐在那里沮丧地想“但是为什么?我从来没有写过用户不能。”。是的。但是您也从未明确写过他可以...
class User < ActiveRecord::Base
belongs_to :role
delegate :permissions, :to => :role
def method_missing(method_id, *args)
if match = matches_dynamic_role_check?(method_id)
tokenize_roles(match.captures.first).each do |check|
return true if role.name.downcase == check
end
return false
elsif match = matches_dynamic_perm_check?(method_id)
return true if permissions.find_by_name(match.captures.first)
else
super
end
end
private
def matches_dynamic_perm_check?(method_id)
/^can_([a-zA-Z]\w*)\?$/.match(method_id.to_s)
end
def matches_dynamic_role_check?(method_id)
/^is_an?_([a-zA-Z]\w*)\?$/.match(method_id.to_s)
end
def tokenize_roles(string_to_split)
string_to_split.split(/_or_/)
end
end
用法:
user.is_an? 行政
user.can_delete?