Я обнаружил, что решение в оригинальной публикации не работает для меня. Я хотел, чтобы первый пользователь вышел из системы и на странице входа. Кроме того, метод sign_out_and_redirect(current_user)
не работает так, как я ожидал. Используя переопределение SessionController в этом решении, я модифицировал его для использования веб-сокетов следующим образом:
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
. В моей заявке каждая страница также имеет кнопку «выйти», которая выдает клиенту через сеансовое действие «Уничтожить». Когда ответ веб-камеры запускается на веб-странице, он просто нажимает на эту кнопку - вызывается логика выписки, а первый пользователь представлен на странице входа.
Это решение также не требует skip_before_filter :check_concurrent_session
и модель login_token
, поскольку она запускает принудительный выход без предубеждений.
Для записи, devise_security_extension
, как представляется, обеспечивает функциональность, чтобы сделать это. Он также устанавливает соответствующее предупреждение, предупреждающее первого пользователя о том, что произошло (я еще не понял, как это сделать).
Опция TRAILING
с TRIM
относится к последним символам, а не к целым словам, начинающимся с определенного слова. Попробуйте использовать INSTR
здесь:
UPDATE scanner
SET pagetitle = LEFT(pagetitle, INSTR(pagetitle, 'via') - 2);
WHERE pagetitle REGEXP '[[:<:]]via[[:>:]]';
Если вы используете MySQL 8+ или более позднюю версию, то мы можем попробовать использовать REGEXP_REPLACE
:
UPDATE scanner
SET pagetitle = REGEXP_REPLACE(pagetitle, '\\s+via.*', '');