ПРЕДПОСЫЛКА
Мы используем сервер Glassfish и настроили его с включенным Single Sign-On (SSO) , чтобы пользователь мог проходить аутентификацию только один раз и могдоступ к нескольким веб-приложениям.Каждое веб-приложение задает имя входа на основе FORM (* j_security_check *), и для целей разработки мы используем File Realm .Это работает нормально.
Glassfish генерирует как Сеанс (с областью доступа к пути веб-приложения, где проходила аутентификация пользователя), так и Cookie (JSESSIONIDSSO), чтобы идентифицировать состояние аутентификации для сервера (и других веб-приложений).
Вы можете заставить пользователя пройти повторную аутентификацию, вызвав Session.invalidate () в сеансе веб-приложения пользователя, что также делает недействительным файл cookie единого входа.Все это прекрасно работает.
ПРОБЛЕМА
Мы ищем способ запретить пользователю одновременный вход в систему.Кажется естественным попытаться перехватить либо созданный пользователем сеанс (или файл cookie единого входа), и сохранить его на карте с указанием имени пользователя, которую можно проверить, когда кто-нибудь заходит на страницу входа, и аннулировать старый сеанс, если он существует.
В идеале мы хотели бы обработать некоторое событие после аутентификации в контексте, где мы можем получить доступ как к имени пользователя (или объекту Principal), так и к созданному сеансу.(Я смотрел на HttpSessionListener, но, похоже, он не предоставляет никакого доступа пользователю, с которым он связан).
Я пытаюсь сделать это без какого-либо ключа (потому что я думаю о нескольких)или введение какой-то другой совершенно новой платформы в приложение (например, Spring Security).(И, надеюсь, это не требует реализации всего модуля JAAS ...)