1

我已经使用 ActiveAdmin、Cancan、Devise 和 Rolify 建立了一个基础应用程序。它使用单用户模型(没有单独的管理员/用户)。

到目前为止就像一个魅力,但我正在努力将管理界面的访问权限限制为具有角色“超级管理员”的用户(角色在表“角色”中定义并通过 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

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

非常感谢!

4

1 回答 1

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 方法提供 Hash。

当然,这是如果您的 User 模型响应role并接受角色名称的参数。我认为您实际上想要这样做:current_user.try(:has_role?, 'superadmin')

于 2014-02-04T18:34:09.953 回答