我已经使用ActiveAdmin,Cancan,Devise和Rolify设置了一个基础应用程序。它使用单一用户模型(没有单独的管理员/用户)。
到目前为止,它像魅力一样工作,但我正在努力限制对具有角色'superadmin'的用户的管理界面的访问权限(角色在表'角色'中定义并通过users_roles分配)
在activeadmin初始化器中,我设置了:
config.authentication_method = :authenticate_superadmin_user!
config.authorization_adapter = ActiveAdmin::CanCanAdapter
config.cancan_ability_class = "AdminAbility"
然后我创建了一个名为admin_ability.rb的文件:
class AdminAbility
include CanCan::Ability
def initialize(user)
if user.has_role?('superadmin')
can :manage, :all
end
end
end
这是我的应用程序控制器:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def authenticate_superadmin_user!
raise SecurityError unless current_user.try(:role => 'superadmin')
end
def access_denied(exception)
redirect_to root_path, :alert => exception.message
end
end
我想我在某个地方犯了一个愚蠢的错误(而且我做了太多的复制和粘贴) - 可能在应用程序控制器中?有人可以帮助我并解释我做错了吗?
非常有责任!
答案 0 :(得分:2)
您正在调用try
方法,请更改此项:
def authenticate_superadmin_user!
raise SecurityError unless current_user.try(:role => 'superadmin')
end
到此:
def authenticate_superadmin_user!
raise SecurityError unless current_user.try(:role, 'superadmin')
end
try
方法的第一个参数是方法名称,之后的每个参数都是该方法的参数。您正在向无效的try方法提供哈希。
当然,这是因为您的用户模型响应role
并接受角色名称的参数。我认为你真的想做:current_user.try(:has_role?, 'superadmin')