ActionController сессий и подклассов - PullRequest
1 голос
/ 19 января 2012

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

В моем приложении я хочу, чтобы пользователи могли проходить проверку подлинности с любой страницы с использованием 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, хэш сессии пуст!?

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

1 Ответ

2 голосов
/ 19 января 2012

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

Вставляется before_filter, который выполняет эту проверку, если он не проходит, то rails сбрасываетсеанс, который согласуется с вашей ситуацией.

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

Один из способов проверить это - добавить

def handle_unverified_request super Rails.logger.info "для обработки непроверенного запроса - проблема csrf" end

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

...