【问题标题】:Checking for superadmin role检查超级管理员角色
【发布时间】:2014-02-28 21:25:28
【问题描述】:

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

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

非常感谢!

【问题讨论】:

  • 任何想法如何让超级管理员使用设计:是否有指向此类页面的链接?

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


【解决方案1】:

你错误地调用了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')

【讨论】:

  • 好吧,这有点尴尬。谢谢!但是,它仍然不起作用 - :role 在不同的表中时会访问该角色吗? (角色在表'roles'中定义并通过users_roles分配)
  • 我认为对于初学者来说,我一次尝试的太多了——我将回到我的书本以更好地理解这一切:/ 现在我正在为太多的基础知识而苦苦挣扎。不过感谢您的帮助!
  • 别不好意思。我们都必须从某个地方开始。重要的是不断尝试,直到你得到它。快乐编码:)
猜你喜欢
  • 2016-03-05
  • 2021-04-28
  • 2018-10-26
  • 2011-09-26
  • 1970-01-01
  • 2020-05-18
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多