Аутентификация не обязательно означает успешный вход в систему. Пользователь может быть успешно аутентифицирован с помощью, например, двухстороннего SSL (сертификаты X.509), и, тем не менее, Spring Security перенаправит вас на страницу с ошибкой, если управление параллельным сеансом настроено с max-sessions="1"
, и это второй одновременный вход в систему попытка. Если ваша настройка проста, без контроля параллелизма сеанса, вы можете принять логин = аутентификацию для всех практических целей. В противном случае, если у вас есть, например, логика, которая записывает каждый успешный вход в базу данных, вам придется вызывать эту логику в момент фактического входа, а не в момент аутентификации. , Один из способов (ни в коем случае не оптимальный, при условии моего ограниченного понимания инфраструктуры Spring Security) сделать это - реализовать свой собственный ConcurrentSessionControlAuthenticationStrategy
(нажмите здесь для исходного кода) и вставить его в CompositeSessionAuthenticationStrategy
в XML-конфигурации конфигурации Spring Security (3.2 и выше):
<http>
.
.
<session-management session-authentication-strategy-ref="sas" />
.
.
</http>
.
.
<beans:bean id="sas" class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy">
<beans:constructor-arg>
<beans:list>
<beans:bean class="path.to.my.implementation.of.ConcurrentSessionControlAuthenticationStrategy">
<beans:constructor-arg ref="sessionRegistry"/>
<beans:property name="maximumSessions" value="1"/>
<beans:property name="exceptionIfMaximumExceeded" value="true"/>
<beans:bean>
<beans:bean class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy"/>
<beans:bean class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy"/>
<beans:constructor-arg ref="sessionRegistry"/>
</beans:bean>
</beans:list>
</beans:constructor-arg>
</beans:bean>
<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/>
Я бы предпочел внедрить пользовательский обработчик PostLogin
в ConcurrentSessionControlAuthenticationStrategy
фреймворка, вместо того, чтобы вставлять из него копию в мой пользовательский ConcurrentSessionControlAuthenticationStrategy
и вносить в него изменения, но я не знаю, как это сделать. сделай это в данный момент.
Более полный пример конфигурации можно найти здесь .