В приложении на Rails 4 возникла странная проблема, заключающаяся в том, что переменные сеанса могут быть правильно установлены до входа в систему, но не после входа в систему
Это старое приложение с Rails 4.2.11 и Ruby 2.2.10, Devise 3.5.6 используется для аутентификации пользователя. В последнее время необходимо добавить поддержку мультитенантов с помощью самообслуживания, поскольку по некоторым причинам подход с использованием поддоменов не используется для определения арендатора, но добавляется выбор арендатора при входе в систему, а также переключение арендатора в пользовательском интерфейсе. Хотелось бы установить текущего арендатора в сеансе, чтобы было доступно кросс-запросы. Но странно, что значение переменной сеанса не может быть обновлено.
Поток
- Он работает с omniauth, после входа в систему в поставщике omniauth вызывается следующий метод обратного вызоваустановить текущего арендатора и войти в систему для разработки.
- 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, но все еще не знает причину. Я думаю, что это должно быть где-то проблема конфигурации ...