Как обрабатывать время ожидания сеанса при использовании программной безопасности Servlet 3.0 - PullRequest
5 голосов
/ 24 февраля 2012

Относительно программной безопасности Servlet 3.0, когда время ожидания сеанса не может быть вызвано HttpServletRequest#logout().

Остался ли пользователь в системе JAAS?

Если это так, что является наилучшей практикой для выхода из JAAS после истечения времени сеанса?

Как контейнер обрабатывает последующий запрос пользователя на повторный вход в систему и создание нового сеанса после истечения времени ожидания сеанса?

Кроме того, каковы преимущества и недостатки использования следующих трех подходов для обработки времени ожидания сеанса при использовании программной безопасности Servlet 3.0:

  1. HttpSessionListener#sessionDestroyed()
  2. Сделайте @ManagedBean @SessionScoped LoginManager орудие HttpSessionBindingListener и сделайте что-нибудь в valueUnbound.
  3. Аннотируйте метод в LoginManager с помощью @ PreDestroy.

Любые другие предложенные подходы / советы по передовому опыту, несомненно, будут оценены.

Ответы [ 2 ]

3 голосов
/ 18 июля 2012

Где-то в спецификации сервлета есть утверждение о том, что недействительность сеанса точно соответствует состоянию, в котором в нем нет принципала.Это ключ.logout () и timeout делают недействительным сеанс и делают его недействительным, удаляя Принципал из него и все его привязки значений.

Все, что на самом деле делает JAAS, - это позволяет LoginModules накапливать Принципалы в Subject, как для пользователя, так и для его ролей.Все, что на самом деле нужно сделать с помощью метода JAAS logout(), это очистить Субъект Принципалов, которые были добавлены тем же модулем login(), или, более вероятно, commit(), и это действительно просто для полной безопасности, если у вас естьдобавил такие вещи, как личные учетные данные в тему.Поскольку logout () не будет выполняться тем же экземпляром, что и login () / commit (), это удаление должно основываться на основном классе, а не на внутренней коллекции принципалов.

Выход из системы JAAS () не вызывается, когда сеанс истекает, но так как Принципал удаляется из сеанса, который не должен ни для кого иметь значение.

Если вы хотите отслеживать завершение сеанса по какой-либо другой причине, например, ведение журнала, makeВаш пользователь отправляет прослушиватель привязки сеанса и регистрирует завершение как выход из системы в методе valueUnbound (): на мой взгляд, это на 100% надежно.

Чтобы ответить на другие ваши вопросы, такого состояния как'залогинен в JAAS': JAAS предоставляет сервис входа / выхода в контейнер , а не в себя;и новый логин - это новый логин, в новый сеанс, независимо от того, истек ли предыдущий или нет.

2 голосов
/ 09 марта 2012

Управление сессиями напрямую не связано с JAAS .. и управление сессиями действительно зависит от вашего контейнера.

В Jetty 8 управление сессиями обрабатывается SessionManager (на уровне контекста) и SessionIdManager (на уровне сервера).

Браузер отправляет идентификатор сеанса на сервер. Класс, реализующий SessionManager, проверяет идентификатор сессии. Если срок сеанса истек, сеанс становится недействительным и удаляется, а слушатели сеанса уведомляются.

Я не уверен, почему тогда вам нужно «выйти» из системы, но вы должны иметь возможность подключить свой выход к слушателям.

«Оставаться в системе JAAS» может не иметь большого значения для вашего контейнера. У Jetty нет кэша пользователя / принципалов / субъектов, поэтому вы не будете «оставаться в системе», если вы сами не внедрили кеш, как мы.

Модуль JAAS просто обеспечивает аутентификацию и авторизацию; больше ничего.

ADD

Когда сеанс истекает, сервер отправляет 302 назад и перенаправляет на страницу входа. Отправка формы на странице вызывает модуль Login (который может быть модулем JAAS) и после успешной аутентификации создает новый сеанс и идентификатор сеанса, который обычно отправляется обратно в браузер с помощью файла cookie (или перезаписи URL).

Если ваше приложение не обрабатывает один и тот же идентификатор контекста для всех ваших контекстов, я не думаю, что вы должны выполнять какой-либо программный выход из системы по окончании сеанса; Вы можете «сделать недействительным» пользователя, который все еще имеет действительный сеанс в другом контексте.

...