2013-12-17 3 views
1

У меня проблема, которая очень странная для меня, поэтому, возможно, кто-то может помочь. Внутри моего security.xml я это:Spring Security authenticationSuccessHandler и j_security_check

<http auto-config="true"> 
    <intercept-url pattern="/app/admin/**" access="ROLE_ADMIN"/> 
    <intercept-url pattern="/app/**" access="ROLE_ADMIN,ROLE_USER"/> 
    <form-login login-page="/login" authentication-failure-url="/login?error=true" login-processing-url="/j_security_check" authentication-success-handler-ref="authSuccessHandler"/> 
    <remember-me user-service-ref="userDao" key="e37f4b31-0c45-11dd-bd0b-0800200c9a66" authentication-success-handler-ref="authSuccessHandler"/> 
</http> 

Все работало отлично, пока я не добавил: аутентификация успех обработчик-исй = «authSuccessHandler», который прост и выглядит следующим образом:

 @Override 
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { 
    logger.info("authenticated"); 
    User user = userManager.getUserByUsername(request.getRemoteUser()); 
    Hibernate.initialize(user.getMessagesList()); 
    request.getSession(true).setAttribute("userMessages", user.getMessagesList()); 
} 

Теперь, когда все работает полностью, проблема заключается в том, что при каждом входе в систему или в имени пользователя RememberMe первая доступная страница является ВСЕЙ пустой, независимо от URL-адреса. И при обычном входе в систему страница, которая выглядит пустым, это/j_security_check, поэтому кажется, что что-то не обрабатывается из-за моего обработчика успеха, как и ожидалось при удалении обработчика, все работает нормально. Я что-то упустил? пожалуйста, помогите мне.

ответ

3

Обычно, когда вы явно не настраиваете AuthenticationSuccessHandler, пружина настраивает SavedRequestAwareAuthenticationSuccessHandler для обработки случая успеха. То, что он делает, - это после успешной проверки подлинности, отправляет пользователя на первоначально запрошенный URL (или когда указано и принудительно на страницу по умолчанию, указанную в конфигурации).

В вашей пользовательской реализации нет такой вещи, что она только устанавливает что-то на сессии и выполняется, она ничего не возвращает клиенту. То, что вы, вероятно, хотите, - это продлить действие SavedRequestAwareAuthenticationSuccessHandler, а затем позвонить super.onAuthenticationSuccess

+0

Спасибо, что это была проблема. Мне пришлось переключиться на: SecurityContextHolder.getContext(). GetAuthentication(). GetName() вместо request.getRemoteUser(), поскольку это не работало с логином j_security_check, но все работает так, как должно быть сейчас! – Dustin

+1

Интеграция весенней безопасности работает только после того, как «SecurityContextHolderAwareRequestFilter» выполнил свою работу. Этот фильтр выполняется после фильтра, который обрабатывает форму-логин. Так что 'request.getRemoteUser()' еще не работает. –

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