Я создаю веб-приложение с Spring Security, которое будет жить на Amazon EC2 и будет использовать Amazon Elastic Load Balancers. К сожалению, ELB не поддерживает липкие сеансы, поэтому мне нужно убедиться, что мое приложение работает правильно без сеансов.
Пока я настроил RememberMeServices для назначения токена через cookie, и это работает нормально, но я хочу, чтобы срок действия cookie истекал вместе с сеансом браузера (например, когда браузер закрывается).
Я должен представить, что я не первый, кто хочет использовать Spring Security без сессий ... есть предложения?
spring
spring-security
load-balancing
amazon-ec2
Джаррод Карлсон
источник
источник
В Spring Securitiy 3.0 это стало еще проще. Если вы используете конфигурацию пространства имен, вы можете просто сделать следующее:
Или вы можете настроить SecurityContextRepository как нуль, и ничто никогда не спасаются таким образом , как хорошо .
источник
Сегодня мы работали над той же проблемой (внедрение настраиваемого SecurityContextRepository в SecurityContextPersistenceFilter) в течение 4-5 часов. Наконец, мы в этом разобрались. Прежде всего, в разделе 8.3 Spring Security исх. doc, есть определение bean-компонента SecurityContextPersistenceFilter
И после этого определения есть следующее объяснение: «В качестве альтернативы вы можете предоставить нулевую реализацию интерфейса SecurityContextRepository, которая предотвратит сохранение контекста безопасности, даже если сеанс уже был создан во время запроса».
Нам нужно было внедрить наш настраиваемый SecurityContextRepository в SecurityContextPersistenceFilter. Поэтому мы просто изменили приведенное выше определение bean-компонента на наш собственный impl и поместили его в контекст безопасности.
Когда мы запускали приложение, мы проследили журналы и увидели, что SecurityContextPersistenceFilter не использует наш настраиваемый impl, он использует HttpSessionSecurityContextRepository.
После того, как мы попробовали еще несколько вещей, мы выяснили, что должны предоставить нашему настраиваемому SecurityContextRepository имплицит с атрибутом «security-context-repository-ref» пространства имен «http». Если вы используете пространство имен «http» и хотите внедрить свой собственный SecurityContextRepository impl, попробуйте атрибут security-context-repository-ref.
Когда используется пространство имен «http», отдельное определение SecurityContextPersistenceFilter игнорируется. Как я скопировал выше, справочный документ. не говорит об этом.
Пожалуйста, поправьте меня, если я неправильно понял вещи.
источник
Взгляните на
SecurityContextPersistenceFilter
класс. Он определяет, какSecurityContextHolder
заполняется. По умолчанию он используетсяHttpSessionSecurityContextRepository
для хранения контекста безопасности в сеансе http.Я довольно легко реализовал этот механизм с помощью custom
SecurityContextRepository
.См.
securityContext.xml
Ниже:источник
На самом деле
create-session="never"
не означает быть полностью апатридом. Для этого есть проблема в управлении проблемами Spring Security.источник
После борьбы с многочисленными решениями, опубликованными в этом ответе, чтобы попытаться заставить что-то работать при использовании
<http>
конфигурации пространства имен, я наконец нашел подход, который действительно работает для моего варианта использования. На самом деле я не требую, чтобы Spring Security не запускал сеанс (потому что я использую сеанс в других частях приложения), просто он вообще не «запоминает» аутентификацию в сеансе (его следует перепроверить каждый запрос).Во-первых, я не мог понять, как использовать описанную выше технику «нулевой реализации». Было неясно, должны ли вы установить securityContextRepository в
null
или в реализацию без операции. Первый не работает, потому чтоNullPointerException
внутрь бросаютSecurityContextPersistenceFilter.doFilter()
. Что касается реализации без операции, я попытался реализовать ее самым простым способом, который я мог представить:В моем приложении это не работает из-за какого-то странного отношения
ClassCastException
кresponse_
типу.Даже если предположить, что мне удалось найти реализацию, которая работает (просто не сохраняя контекст в сеансе), все еще остается проблема, как внедрить это в фильтры, созданные
<http>
конфигурацией. Вы не можете просто заменить фильтр вSECURITY_CONTEXT_FILTER
позиции, как указано в документации . Единственный способ подключиться к тому,SecurityContextPersistenceFilter
что создается под обложками, - это написать уродливыйApplicationContextAware
bean-компонент:В любом случае, к решению, которое действительно работает, хотя и очень хакерское. Просто используйте,
Filter
который удаляет запись сеанса, которуюHttpSessionSecurityContextRepository
ищет, когда делает свое дело:Затем в конфигурации:
источник
WebSecurityConfigurerAdapter
с "http.addFilterBefore(new SpringSecuritySessionDeletingFilter(), SecurityContextPersistenceFilter.class)
"Небольшое примечание: это "create-session", а не "create-sessions".
создать сеанс
Управляет энергией, с которой создается сеанс HTTP.
Если не установлен, по умолчанию используется «ifRequired». Другие варианты - «всегда» и «никогда».
Установка этого атрибута влияет на свойства allowSessionCreation и forceEagerSessionCreation HttpSessionContextIntegrationFilter. allowSessionCreation всегда будет истинным, если для этого атрибута не установлено значение «никогда». forceEagerSessionCreation имеет значение "false", если не установлено значение "always".
Таким образом, конфигурация по умолчанию позволяет создание сеанса, но не заставляет его. Исключением является то, что если включено управление одновременным сеансом, для forceEagerSessionCreation будет установлено значение true, независимо от того, какой здесь параметр. Использование «никогда» вызовет исключение во время инициализации HttpSessionContextIntegrationFilter.
Для получения конкретных сведений об использовании сеанса есть хорошая документация в javadoc HttpSessionSecurityContextRepository.
источник
auto-config=false
, что вы, очевидно, не можете заменить то, что находится вSECURITY_CONTEXT_FILTER
позиции, своим собственным. Я взламывал, пытаясь отключить его с помощью некоторогоApplicationContextAware
bean (используя отражение, чтобы принудительноsecurityContextRepository
установить нулевую реализациюSessionManagementFilter
), но без кубиков. И, к сожалению, я не могу перейти на весеннюю безопасность 3,1 года, которая могла бы обеспечитьcreate-session=stateless
.