Я обнаружил, что решение в оригинальной публикации не совсем работает для меня.Я хотел, чтобы первый пользователь вышел из системы и представил страницу входа.Кроме того, метод sign_out_and_redirect(current_user)
, похоже, не работает так, как я ожидал.Используя переопределение SessionsController в этом решении, я изменил его для использования веб-сокетов следующим образом:
def create
super
force_logout
end
private
def force_logout
logout_subscribe_address = "signout_subscribe_response_#{current_user[:id]}"
logout_subscribe_resp = {:message => "#{logout_subscribe_address }: #{current_user[:email]} signed out."}
WebsocketRails[:signout_subscribe].trigger(signout_subscribe_address, signout_subscribe_resp)
end
end
Убедитесь, что все веб-страницы подписаны на канал выхода и привязывают его к одному действию logout_subscribe_address
.В моем приложении на каждой странице также есть кнопка «Выход», с помощью которой клиент выходит из системы с помощью действия Destroy сеанса devise.Когда на веб-странице запускается ответ веб-сокета, он просто нажимает эту кнопку - вызывается логика выхода и первый пользователь получает страницу входа.
Это решение также не требует skip_before_filter :check_concurrent_session
и модель login_token
, поскольку она запускает принудительный выход без ущерба.
Для записи, devise_security_extension
, по-видимому, также предоставляет функциональные возможности для этого.Также выдает соответствующее предупреждение, предупреждающее первого пользователя о том, что произошло (я пока не выяснил, как это сделать).