2010-02-12 1 views
0

Учитывая, что это хорошо документировано, как использовать before_filter для единой классификации пользователей, мне не удается получить защиту уровня действия для нескольких типов пользователей. Поясню:Как получить защиту уровня действия с использованием Authlogic и STI?

у меня есть что-то вроде этого ...

class ApplicationController < ActionController::Base 
    class << self 
    attr_accessor :standard_actions 
    end 
    @standard_actions = [:index, :show, :new, :edit, :create, :update, :destroy] 

    def require_guardian 
    unless current_user and current_user.is_a?(Guardian) 
     store_location 
     redirect_to home_url 
     return false 
    end 
    end 

    def require_admin 
    unless current_user and current_user.is_a?(Administrator) 
     store_location 
     redirect_to register_url 
     return false 
    end 
    end 
end 

И в GuardiansController Я хочу, чтобы только стандартные действия для администратора, но все остальные действия должны требовать Guardian. Поэтому я пробовал это ...

class GuardiansController < ApplicationController 
    before_filter :require_admin, :only => ApplicationController::standard_actions 
    before_filter :require_guardian, :except => ApplicationController::standard_actions 
    ... 
end 

Который в конечном итоге выполняет рекурсивное перенаправление. Должен быть лучший способ?

ответ

0

ОК, это еще один случай, когда вы не смотрите внимательно и ничего не теряете. Я непреднамеренно установил маршрут для перенаправления пользователя рекурсивным способом. Вышеупомянутое решение работает очень хорошо, если вы правильно настроили маршруты:

def require_guardian 
    unless current_user and current_user.is_a?(Guardian) 
    store_location 
    # this route (home_url) sent the user to another controller which ran a before_filter sending them back here again. 
    # redirect_to home_url 
    # So I changed it to a neutral route and it works great! 
    redirect_to register_url 
    return false 
    end 
end