2012-01-10 3 views
16

Я надеялся, что изменение в create-session="stateless" будет конец этого достичь без гражданства безопасности пружинного в моем веб-приложение, но это не так.создания-сессии без гражданства использование

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

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

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

Спасибо!

ответ

18

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

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

+1

Спасибо за ответ. Раньше я пробовал работать с базой и переваривал, но мне было очень неудобно, когда я не мог «выйти» из своего webapp и ввести новые учетные данные без перезапуска браузера. Кроме того, как вы считаете, возможность масштабирования по горизонтали легко для безстоящих Webapp/webservices оправдывает стоимость исполнения? – bertie

+1

@Albert: Трудно сказать много о затратах, не измеряя их по-настоящему. :-) Однако, если вы хотите выйти из системы, то вы _need_ для поддержания некоторого состояния клиента, а это значит, что нужно обрабатывать файлы cookie; клиент должен предоставить какой-то показатель того, о чем он говорит, поскольку сам HTTP не имеет гражданства, и это сложное требование. –

+0

Я бы посоветовал, однако, не слишком беспокоиться о масштабировании для начала; получение пользователей/клиентов - это гораздо более серьезная проблема. При масштабировании реальный ключ заключается в том, можно ли реплицировать службу или иметь экземпляр singleton; как правило, веб-серверы, как правило, сравнительно легко реплицируются, но баз данных нет. –

24

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

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

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

+0

+1: Не знал этого варианта, но потом я еще не слишком много вникал в 3.1. –

+1

+1 Позвольте мне сказать, что этот ответ просто спас мне мир обиды. Tomcat продолжал отказывать в доступе к пользователям, потому что мой клиент RESTful создавал так много сеансов. Спасибо! – thatidiotguy

Смежные вопросы