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

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

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

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

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

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

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

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


person Patrick Garner    schedule 24.02.2012    source источник
comment
Core Java Server Faces с. 525 означает, что в настоящее время нет спецификации для выхода из системы или переключения удостоверений при использовании безопасности, управляемой контейнером.   -  person Patrick Garner    schedule 28.02.2012
comment
Я также наткнулся на пару разглагольствований в блогах о безопасности J2EE, жалующихся на то, что недействительная сессия — плохая замена формальному выходу из системы, но блоги были старше, написаны до Servlet 3.0, который предоставляет средства для программного выхода из системы.   -  person Patrick Garner    schedule 28.02.2012
comment
Очевидно, что ваша версия CJSF предшествует Servlet 3.0.   -  person user207421    schedule 18.07.2012


Ответы (2)


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

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

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

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

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

person user207421    schedule 17.07.2012
comment
+1 за краткий (правильный) ответ =) Из этого поста было удалено много оскорбительных комментариев, что сделало некоторые из (удаленных) ответов бессвязными по тону. Все хорошо, что хорошо кончается. - person earcam; 18.07.2012
comment
Спасибо @EJP. Интересно, что если я устанавливаю точку останова после вызова request.logout(), я вижу, что сеанс не недействителен, хотя участник удаляется из сеанса. При повторном входе в систему JSESSIONID не меняется, и объект сеанса остается точно таким же экземпляром (например, @ 15961), что немного тревожит. Использование session.invalidate() в дополнение к request.logout() или вместо него, конечно, приводит к изменению JSESSIONID и объекта сеанса. Это на JBoss AS7. Самое главное, что Принципал удаляется, как вы сказали, независимо от того, какой из двух методов вызывается. - person Patrick Garner; 18.07.2012
comment
@PatrickGarner Ну, все, что говорится в документации HttpServletRequest.html.logout(), так и есть. Session.invalidate() делает недействительным, но не влияет на текущий запрос или его принципал, поэтому, если вы просто используете это, вы все равно можете отображать вещи, как если бы пользователь вошел в систему. Вы должны вызывать их обоих. Странное дело на самом деле. - person user207421; 18.07.2012

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

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

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

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

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

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

ДОБАВЛЯТЬ

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

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

person b75.    schedule 09.03.2012
comment
Я не знаю, что внутри JAAS. Я не знаю, как веб-контейнер взаимодействует с JAAS, например. где хранятся субъекты, участники и группы, что на самом деле происходит, когда вызывается HttpServletRequest#logout() по сравнению с истечением времени ожидания сеанса. Выполняется ли обслуживание, выполняемое при вызове HttpServletRequest#logout(), также выполняемым контейнером, если время ожидания сеанса истекло? Если нет, то почему в таком случае это не нужно? - person Patrick Garner; 11.03.2012
comment
После прочтения спецификации Servlet 3.0. и спецификация JAAS. и JEE 6 спец. Я не знаю ответов на приведенные выше вопросы, и я надеюсь, что кто-нибудь может указать мне на документацию или ветки списка разработчиков или, возможно, даже проектные документы JBoss/Tomcat/Jetty/Glassfish или фрагменты исходного кода, которые показывают, что происходит с Subject , Principal и Group по истечении времени ожидания сеанса. Было бы здорово узнать, что происходит с этими объектами при вызове HttpServletRequest#logout(). Различия, если таковые имеются, между тем, как обрабатывается выход из системы в этих двух обстоятельствах, будут огромными. - person Patrick Garner; 11.03.2012