Разработайте аутентификацию с помощью STI Sub Classes и Rails Admin
-
13-11-2019 - |
Вопрос
Так что я использую 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) Канкан довольно прост в использовании и стоит небольшую установку.Вот пример того, как может выглядеть приложение / модели / возможности. 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
.
И не забывайте, вам придется добавить канкан на ваш драгоценный элемент, который будет установлен как зависимость.
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
.