Невозможно изменить значение переменной сеанса после входа в Rails 4 - PullRequest
0 голосов
/ 15 октября 2019

В приложении на Rails 4 возникла странная проблема, заключающаяся в том, что переменные сеанса могут быть правильно установлены до входа в систему, но не после входа в систему

Это старое приложение с Rails 4.2.11 и Ruby 2.2.10, Devise 3.5.6 используется для аутентификации пользователя. В последнее время необходимо добавить поддержку мультитенантов с помощью самообслуживания, поскольку по некоторым причинам подход с использованием поддоменов не используется для определения арендатора, но добавляется выбор арендатора при входе в систему, а также переключение арендатора в пользовательском интерфейсе. Хотелось бы установить текущего арендатора в сеансе, чтобы было доступно кросс-запросы. Но странно, что значение переменной сеанса не может быть обновлено.

Поток

  1. Он работает с omniauth, после входа в систему в поставщике omniauth вызывается следующий метод обратного вызоваустановить текущего арендатора и войти в систему для разработки.
  2. POST / users / switch_tenant для переключения на другого арендатора.

Вот фрагмент кода для установки начального арендатора во время входа в систему, и он работает.

  # /app/controllers/users/omniauth_callbacks_controller.rb
  # the callback entry of omniauth 
  def <provider_name>
    # some code to check token, get user and default tenant etc.
    session[:current_tenant] = user_org
    sign_in_and_redirect @user
  end

Вход работает, и сессия [: current_tenant] правильно установлена ​​и доступна в представлениях и контроллерах.

В другом методе переключения арендатора код выглядит как

  # /app/controllers/users/omniauth_callbacks_controller.rb
  # POST /users/switch_tenant
  def switch_tenant
    tenant_id = params[:tenant_id]
    session[:current_tenant] = tenant_id
    Rails.logger.debug "New tenant in session: #{session[:current_tenant]}"
    # check authorization etc...
    redirect_to root_path
  end

В этом методе контроллера сеанс [: current_tenant] обновляется до нового значения (согласно журналу отладки). Но после перенаправления при открытии корневого пути сеанс [: current_tenant] сбрасывается обратно к исходному значению при входе в систему. Я также пытался установить временную переменную сеанса в контроллере, например

  # app/controllers/test_controller.rb
  # GET /test/test
  def test
    Rails.logger.debug "session value in request: #{session[:test_key]}"
    session[:test_key] = "test value"
    Rails.logger.debug "session value after set: #{session[:test_key]}"
    ...
  end

Выходные данныевсегда выглядит как

  session value in request:
  session value after set: test value

Кажется, что не может установить новую переменную сеанса и не может обновить существующую переменную сеанса. Но это может быть установлено до входа в систему ...

Я выполнил поиск и попытался выполнить следующее, все еще не работая: 1) кэш отключен путем установки заголовков ответов:

    response.headers['Cache-Control'] = 'no-cache, no-store'
    response.headers['Pragma'] = 'no-cache'

2) временно удалить CSRF с помощью комментария

  #protect_from_forgery with: :exception

3) проверен размер файла cookie, около 1,2 КБ, ограничение меньше 4 КБ

Потратил целый день, но понятия не имел ... Спасибо за вашу помощь!

[Обновление]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...