Разработать аутентификацию с помощью подклассов STI и Rails Admin - PullRequest
0 голосов
/ 27 февраля 2012

Поэтому я использую STI для включения некоторых ролей в свою таблицу пользователей.Прямо сейчас у меня просто нормальные пользователи и администраторы.Я установил Rails_admin и мне нужен способ аутентификации администраторов, но я не уверен, как это сделать безопасно.

Сейчас у меня есть этот код в моем контроллере приложений

def authenticate_admin!(opts={})
  current_admin || redirect_to(?)
end

def current_admin
  current_user if current_user.is_a? Admin
end

В моем файле rails_admin.rb у меня есть этот

config.authenticate_with do
 authenticate_admin!
end

Моя текущая проблема заключается в том, что я не могуполучить redirect_to, чтобы фактически направить что-либо.Я продолжаю получать ошибки.Также простой перенаправление, если пользователь не администратор все, что мне нужно?Это лучшая практика и самая безопасная?Я иду в правильном направлении здесь?Любая помощь будет оценена.Спасибо

1 Ответ

1 голос
/ 29 февраля 2012

Хорошо, пара вещей:

1) CanCan довольно прост в использовании и заслуживает незначительной установки.Вот пример того, как может выглядеть app / models /ability.rb, если у вас есть два метода экземпляра пользователя is_admin?и is_reviewer?

class Ability
  include CanCan::Ability
  def initialize(user)
    if user && user.is_reviewer?
      can :access, :rails_admin
      can :dashboard
      cannot :read, [Class1, Class2, Class3]
      can :read, Class4
    end
    if user && user.is_admin?
      can :access, :rails_admin
      can :manage, :all
    end
  end
end

Ваша конфигурация RailsAdmin будет содержать следующее:

RailsAdmin.config do |config|
  config.authorize_with :cancan
  ...
end

И не забудьте, что вам нужно будет добавить канкан в ваш Gemfile, чтобы установить его какЗависимость.

2) Далее, и, возможно, более ценно то, что вы не хотите бросать код перенаправления в метод аутентификации.Вместо этого вы можете добавить следующее в ApplicationController:

rescue_from Acl9::AccessDenied do |exception|
  respond_to do |format|
    format.json do
      render :json => { :success => false, :message => "You do not have access to do this action." }
    end
    format.html do
      flash[:error] = 'You do not have access to view this page.'
      redirect_to root_url
    end
  end
end

или просто:

rescue_from Acl9::AccessDenied do |exception|
  flash[:error] = 'You do not have access to view this page.'
  redirect_to root_url
end
...