Rails 用户角色系统 - 同一用户在不同站点上具有多个权限
Rails user-role system - Same user with multiple Rights on different sites
我有一个 Rails-应用程序,它服务于不同的站点。例如
- www.example1.com
- www.example2.com
这些站点存储在 Site
模型中。我还设置了一个用户角色系统,使用 Devise
、Rolify
和 cancancan
现在一个用户可以在不同的网站上拥有不同的角色。例如,他可以是 www.example1.com
上的管理员,但在 www.example2.com
上只能是普通用户
我正在能力模型中加载用户权限。
现在我的问题是:这个 "initialize" 函数在哪里调用?
我需要给这个函数一个额外的参数site_id
,以便只加载网站的适当权限,而不是另一方的权限。
我该怎么做?
models/ability.rb
class Ability
include CanCan::Ability
# From where is this function called, and how can I adjust this call?
def initialize(user, site_id)
return false unless user.present?
user_role = user.users_roles.find_by(site_id: site_id).try(:role)
user_role.permissions.each do |p|
if p.permission_subject_id.nil?
can p.permission_action.to_sym, p.permission_subject_class.constantize
else
can p.permission_action.to_sym, p.permission_subject_class.constantize, id: p.subject_id
end
end unless user_role.nil?
end
end
这是使用 current_ability 方法初始化的。所以你需要像这样
覆盖application_controller中的那个助手
class ApplicationController < ActionController::Base
#...
private
def current_ability
@current_ability ||= Ability.new(current_user, request. original_url)
end
end
我有一个 Rails-应用程序,它服务于不同的站点。例如
- www.example1.com
- www.example2.com
这些站点存储在 Site
模型中。我还设置了一个用户角色系统,使用 Devise
、Rolify
和 cancancan
现在一个用户可以在不同的网站上拥有不同的角色。例如,他可以是 www.example1.com
上的管理员,但在 www.example2.com
我正在能力模型中加载用户权限。
现在我的问题是:这个 "initialize" 函数在哪里调用?
我需要给这个函数一个额外的参数site_id
,以便只加载网站的适当权限,而不是另一方的权限。
我该怎么做?
models/ability.rb
class Ability
include CanCan::Ability
# From where is this function called, and how can I adjust this call?
def initialize(user, site_id)
return false unless user.present?
user_role = user.users_roles.find_by(site_id: site_id).try(:role)
user_role.permissions.each do |p|
if p.permission_subject_id.nil?
can p.permission_action.to_sym, p.permission_subject_class.constantize
else
can p.permission_action.to_sym, p.permission_subject_class.constantize, id: p.subject_id
end
end unless user_role.nil?
end
end
这是使用 current_ability 方法初始化的。所以你需要像这样
覆盖application_controller中的那个助手class ApplicationController < ActionController::Base
#...
private
def current_ability
@current_ability ||= Ability.new(current_user, request. original_url)
end
end