2012-01-19 2 views
1

По умолчанию все контроллеры rails наследуют контроллер приложения.Сессии и подклассы ActionController

В моем приложении я хочу, чтобы пользователи могли проходить аутентификацию с любой страницы, используя http-basic auth, а также аутентифицироваться путем публикации, но только для одного контроллера.

В настоящее время все выглядит так (упрощенно):

class ApplicationController < ActionController::Base 
    before_filter :set_current_user 

    private 

    def set_current_user 
     Authorization.current_user = current_user 
    end 

    def current_user 
     if session[:user].blank? 
      authenticate_or_request_with_http_basic do |user,pass| 
       session[:user] = authenticated_user_or_nil 
      end 
     end 
     session[:user] 
    end 
end 

class UserSessionsController < ApplicationController 
    prepend_before_filter :set_user_from_params 

    private 

    def set_user_from_params 
     session[:user] = authenticated_user_or_nil 
    end 
end 

я поставил точку останова в обоих set_user_from_params и set_current_user и проверили они действительно называют в правильном порядке.

set_user_from_params действительно устанавливает session[:user] правильно, но когда я продолжаю и ударяю точку останова внутри set_current_user, сессия hash пуста !?

Является ли это предполагаемым поведением или я пропустил что-то действительно очевидное?

ответ

2

Если запрос является почтовым отправлением, тогда по умолчанию рельсы будут проверять наличие действительного токена csrf.

Вставляется то, что делает это, если это не удается, тогда рельсы сбрасывают сеанс, что согласуется с вашей ситуацией.

Вам необходимо либо убедиться, что ваш запрос на отправку содержит токен аутентификации, либо (при необходимости) отключите эту проверку, пропустив фильтр verify_authenticity_token.

Один из способов проверки того, чтобы добавить

Защиту handle_unverified_request супер Rails.logger.info "обработка непроверенного запроса - CSRF вопрос" конца

к контроллеру. Если проблема связана с проблемой csrf, этот метод будет вызываться и будет записываться в файл журнала, подтверждающий, что это произошло.

+0

Отличный ответ, спасибо! В моем случае auth происходит из приложения, которое еще не имеет сеанса или токена. Для кого-то еще с этим я просто добавил 'skip_before_filter: verify_authenticity_token,: only =>: create' к рассматриваемому контроллеру. – arrtchiu