Использование сеанса без использования сеанса

Я надеялся, что переход на create-session="stateless" станет для него завершением для обеспечения безопасности без состояния spring в моем webapp, но это не так.

С этим изменением безопасность spring кажется, не работает, поскольку (мое предположение) spring защита ничего не хранит в сеансе и не может выполнять аутентификацию для защищенных веб-запросов.

Как я могу использовать эту безстоящую функцию?

Я пока не могу найти подходящих примеров того, как добиться безопасности без состояния spring для безстоящего веб-клиента.

Спасибо!

Ответы

Ответ 1

У меня есть веб-приложение с поддержкой Spring, которое имеет полную защиту без состояния и единственный способ заставить его работать так, чтобы полностью отключить создание сеанса (с помощью create-session="never"). Это заставляет повторить аутентификацию с каждым запросом, поэтому вам также нужно будет настроить webapp на использование HTTP Basic Auth или Digest Auth (по сравнению с HTTPS, конечно), поскольку они не требуют особо сложных переговоров (напротив, форма и OAuth требуют сеанса, потому что у них есть гораздо более сложный процесс для установления контекста аутентификации). Это означает, что вы хотите поместить элемент типа <security:http-basic /> внутри вашего элемента <security:http>.

(Преимущество этого заключается в том, что он позволяет создавать чрезвычайно простые клиентские библиотеки, поскольку им не нужно делать управление файлами cookie/сеансов. Стоимость - это некоторые издержки на обработку - определение того, какой набор ролей участвует у пользователя как это нужно будет пересчитать по каждому запросу - и некоторые ограничения на механизмы аутентификации, которые вы можете использовать.)

Ответ 2

Ответ на вызов в основном правильный, и для браузера вы, вероятно, не хотите использовать приложение без состояния.

Для справки, create-session="stateless" - лучший вариант, если у вас действительно есть приложение без состояния, такое как клиент RESTful. Этот параметр был введен в Spring Security 3.1. Это позволит избежать добавления частей Spring инфраструктуры безопасности, которые используют сеанс (например, HttpSessionSecurityContextRepository, SessionManagementFilter, RequestCacheFilter), поэтому вы получаете более компактную настройку.

С create-session="never", Spring Безопасность никогда не создаст сам сеанс, но будет использовать один, если ваше приложение сделает. На практике многие пользователи даже не знают, что они создают сеансы, поэтому, если вы действительно не хотите сеанса, когда-либо, тогда stateless является лучшим вариантом.

Ответ 3

Мы можем точно контролировать, когда будет создан наш сеанс, и как Spring Security будет взаимодействовать с ним:

всегда - сеанс всегда будет создан, если он еще не существует

ifRequired - сеанс будет создан только в случае необходимости (по умолчанию)

никогда - структура никогда не создаст сам сеанс, но он будет использовать один, если он уже существует

stateless - сеанс не будет создан или не используется Spring Безопасность