2012-02-27 1 views
0

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

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

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 на самом деле прямой на что угодно. Я продолжаю получать ошибки. Также является простой переадресацией, если пользователь не является администратором всего, что мне нужно? Это лучшая практика и самая безопасная? Я иду в правильном направлении здесь? Любая помощь будет оценена по достоинству. Благодарности

+0

ли вы рассмотреть возможность использования канкан? Или это со стола? –

+0

@StephSkardal Нет, что бы не было на самом деле. Я действительно планировал только наличие двух подклассов, поэтому я не хотел усложнять ситуацию. Однако, если CanCan - лучшее решение этой проблемы, я могу попытаться ее использовать. – Dan

+0

Вы хотите, чтобы вы перенаправлялись на определенный путь, если пользователь не является администратором, не так ли? если это так, то вы можете redirect_to root_path – mohamagdy

ответ

1

Ok, несколько вещей:

1) CanCan довольно прост в использовании и стоит незначительных установок. Вот пример того, как app/models/способность.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 
+0

Я на самом деле решил пойти по пути канкан, так как у меня будет больше, чем просто админы. Однако, поскольку у меня есть настройка STI, как я могу сделать файл возможностей.rb работать? Прямо сейчас у меня есть user && user.is_a? (Admin), но это не работает – Dan

+0

В моем коде is_admin? и is_reviewer? являются обычными методами для пользовательских экземпляров. это? это метод Ruby для объектов. Может, это не работает? Вы проверили, что он работает в консоли? –

+0

Я должен был создать метод is_admin в моей модели user.rb. Еще одна вещь, которую мне пришлось изменить с вашего кода, - «rescue_from Acl9 :: AccessDenied do | exception |» на 'rescue_from CanCan :: AccessDenied do | exception |'. Я получил оставшуюся часть моих проблем отсюда http://stackoverflow.com/questions/9527298/undefined-method-with-cancan-devise-and-sti-roles#comment12072535_9527298 Спасибо! – Dan

Смежные вопросы