Согласно Spring Docs , «В Spring Security 3 пользователь сначала проходит проверку подлинности с помощью AuthenticationManager, и после успешной проверки подлинности создается сеанс».
Вместо этого вы можете реализовать свой собственный AuthenticationSuccessHandler
(возможно, создав подкласс SavedRequestAwareAuthenticationSuccessHandler
). Вы можете поместить любую логику в метод onAuthenticationSuccess
, поэтому перенесите туда существующую логику:
public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
// declare and initialize lock and sessionAuthMap at some point...
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
lock.writeLock().lock();
try {
sessionAuthMap.put(request.getSession().getId(), authentication);
} finally {
lock.writeLock().unlock();
}
super.onAuthenticationSuccess(request, response, authentication);
}
}
Затем обновите свои конфигурации, чтобы Spring Security вызывал этот класс во время процесса аутентификации. Вот как это сделать:
Шаг 1: настройте UsernamePasswordAuthenticationFilter
, созданный элементом <form-login>
. В частности, поместите это в ваш элемент <http>
:
<sec:custom-filter position="FORM_LOGIN_FILTER" ref="myFilter" />
Шаг 2: определите myFilter и подключите к нему MyAuthenticationSuccessHandler
.
<bean id="myFilter"
class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager" />
<property name="authenticationFailureHandler" ref="myAuthenticationSuccessHandler" />
<property name="authenticationSuccessHandler" ref="myAuthenticationFailureHandler" />
</bean>
<bean id="myAuthenticationSuccessHandler"
class="my.MyAuthenticationSuccessHandler">
<!-- set properties here -->
</bean>
<!-- you can subclass this or one of its parents, too -->
<bean id="myAuthenticationFailureHandler"
class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
<!-- set properties such as exceptionMappings here -->
</bean>
Подробнее см. http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html. Также см. AbstractAuthenticationProcessingFilter документы.
Кстати, ваша проблема напоминает мне об OAuth. По сути, вы выдаете клиенту токен доступа в результате авторизации владельца ресурса.