2010-07-29 1 views
1

Я использую authlogic для аутентификации пользователей. В моих контроллеров я использую CURRENT_USER, определенный (как описано) следующим образом:Определение current_user с declarative_authorization и authlogic

def current_user_session 
    return @current_user_session if defined?(@current_user_session) 
    @current_user_session = UserSession.find 
    end 
    def current_user 
    return @current_user if defined?(@current_user) 
    @current_user = current_user_session && current_user_session.record 
    end 

Я также использую declarative_authorization для управления правами текущего пользователя. Все работает нормально в обычном сценарии выполнения, но когда я создаю функциональные тесты, которые используют запросы запроса, такие как «get_with», current_user в контроллере равен нулю. Я просмотрел тестовый вспомогательный код declarative_authorization и обнаружил, что в этом сценарии атрибут declarative_authorization фактически хранит текущего пользователя в Authorization.current_user (который, в свою очередь, принадлежит Thread.current ["current_user"]). Таким образом, похоже, что существует довольно сложная смесь того, как текущий пользователь обрабатывается в разных сценариях.

Мой вопрос: каков подходящий способ нахождения current_user как в обычном режиме выполнения, так и в тестовом сценарии?

ответ

0

Angelus, вы были правы. Я не должен использовать get_with, post_with и т. Д. Они просто устанавливают Authorization.current_user, session [: user] и session [: user_id], и они кажутся устаревшими с authlogic. И по какой-то причине они даже устанавливали UserSession на ноль, что вызывало проблему. Таким образом, UserSession.create (users (: admin)), за которым следуют регулярные сообщения, почта и т. Д., - это путь.

0

Вы можете определить параметр before_filter, как это в application_controller.

before_filter {| c | Authorization.current_user = c.current_user}

+0

Да, я попробовал это. Но это наоборот: в функциональном тесте Authorization.current_user содержит правильного пользователя, но c.current_user == nil. Поэтому этот оператор не будет работать ... –

+0

Один вопрос: как вы поддерживаете сеанс пользователя в тестах? Попробуйте отладить сеанс, возможно, он по-прежнему сохраняется по какой-то причине. –

+1

Насколько я могу судить, чтобы войти в систему с помощью authlogic, вы должны создать его сеанс через UserSession.create (user (: admin)), а затем будет работать текущий пользователь authlogic. – Draiken