检查superadmin角色

时间:2014-02-04 18:28:35

标签: ruby-on-rails devise activeadmin cancan rolify

我已经使用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

我想我在某个地方犯了一个愚蠢的错误(而且我做了太多的复制和粘贴) - 可能在应用程序控制器中?有人可以帮助我并解释我做错了吗?

非常有责任!

1 个答案:

答案 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')