По поводу вашей второй проблемы:
Если ConcurrentSessionFilter перестал работать (т.е. больше не предотвращает параллельные сеансы), это может быть связано с кластеризованными контейнерами приложений с прикрепленными сеансами.
В такой настройке каждый из узлов кластера работает независимо и не разделяет состояние с другими узлами. Вместо этого балансировщик нагрузки гарантирует, что существующие сеансы всегда будут обслуживаться одним и тем же узлом.
Теперь ConcurrentSessionController
Spring Security работает путем сопоставления сеансов с принципалами. Сам контроллер полагается на HttpSessionEventPublisher
отправку ApplicationEvents
при запуске и завершении пользовательских сеансов.
Все будет хорошо, если кто-то, намеревающийся открыть более одного сеанса, окажется на том же узле, у которого он уже открыл сеанс. HttpSessionEventPublisher
сообщает параллельному механизму сеанса о создании сеанса, и аутентификация не удастся, потому что с этим пользователем уже связан сеанс. Однако на другом узле сеанса для этого пользователя еще нет, поэтому ConcurrentSessionController
не жалуется и вход в систему завершается успешно.
К счастью, решение проблемы должно быть простым: реализовать собственный SessionRegistry
и использовать общее хранилище данных для всех узлов (например, базы данных приложения).