Проверка роли суперадминистратора

Я установил базовое приложение с 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

Я думаю, что где-то делаю глупую ошибку (и я сделал слишком много копий и вставок) - возможно, в контроллере приложений? Может ли кто-нибудь помочь мне и объяснить, что я сделал неправильно?

Весьма признателен!


person Thomas Kuhlmann    schedule 04.02.2014    source источник
comment
есть идеи, как заставить суперадмина работать с devise: есть ли ссылка на такую ​​страницу?   -  person BKSpurgeon    schedule 08.06.2016


Ответы (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, который недействителен.

Это, конечно, если ваша модель User отвечает на role и принимает аргумент имени роли. Я думаю, вы действительно хотите сделать: current_user.try(:has_role?, 'superadmin')

person DiegoSalazar    schedule 04.02.2014
comment
Хорошо, это немного смущает. Спасибо! Однако это по-прежнему не работает - будет ли :role обращаться к роли, когда она находится в другой таблице? (роли определяются в таблице «роли» и назначаются через user_roles) - person Thomas Kuhlmann; 04.02.2014
comment
Я думаю, что для новичка я слишком много пробую сразу - я вернусь к своим книгам, чтобы лучше понять все это: / Сейчас я борюсь со слишком многими основами. Спасибо за вашу помощь! - person Thomas Kuhlmann; 04.02.2014
comment
Не смущайтесь. Мы все должны с чего-то начинать. Важно продолжать попытки, пока не получится. Удачного кодирования :) - person DiegoSalazar; 04.02.2014