Весной SecurityContextHolder.метода getcontext().getAuthentication () возвращает null после RedirectView используется в HTTPS / SSL

у меня есть типичный весенний MVC, работающий на Tomcat. После переключения системы на HTTPS (все работает нормально под простым HTTP) логин перестал работать. Причина в том, что весна - это.

Я уже искал ответ, единственный, который я нашел, предложил установить свойство redirectHttp10Compatible до false на viewResolver настройка bean. Это не помогло.

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

в чем может быть проблема?

<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">


  <http auto-config="true">
    <intercept-url pattern="/**" requires-channel="https" />

    <intercept-url pattern="/index*" access="ROLE_USER"/>


    <intercept-url pattern="/dashboard*" access="ROLE_USER" requires-channel="https"/>  

    <intercept-url pattern="/login*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>
    <intercept-url pattern="/signin*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>
    <intercept-url pattern="/signup*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>    


    <form-login login-page="/home" 
                default-target-url="/home" 
                authentication-failure-url="/home?authentication_error=true"
                authentication-success-handler-ref="redefineTargetURL"
    />


    <anonymous username="guest" granted-authority="ROLE_GUEST" key="anonymousKey"/>
    <logout invalidate-session="true" logout-success-url="/logout?message=Logout Successful" />

    </http>



<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="userDetailsService" />
</authentication-manager>


<beans:bean id="redefineTargetURL" class="com.groupskeed.common.RedefineTargetURL" />
<beans:bean id="userDetailsService" class="com.groupskeed.security.UserDetailsServiceImpl" />

1 ответов


на SecurityContextHolder.getContext().getAuthentication() становится null после перенаправления правильно, так как он threadbound. Но она должна быть заселена с сессии. Поэтому постарайтесь отслеживать SPRING_SECURITY_CONTEXT атрибут в сеансе. Вот пример кода, чтобы получить представление:

HttpSession session = request.getSession(true);
System.out.println(session.getAttribute("SPRING_SECURITY_CONTEXT"));

в документации по безопасности Spring есть часть о том, как переключение HTTPS/HTTP может испортить сеанс, возможно, есть намек на вашу проблему где-то в там. http://static.springsource.org/spring-security/site/faq.html#d0e223

приведенный выше FAQ приводит к рассмотрению того, как сеанс обрабатывается в вашем приложении. Вероятно,я бы начал смотреть на реализацию AuthenticationSuccessHandler. (Вы можете psot его в свой вопрос, если хотите.)

для получения более подробной информации о том, как контекст безопасности обрабатывается в веб-приложениях см. Следующее: (раздел 5.4): http://static.springsource.org/spring-security/site/docs/3.0.x/reference/technical-overview.html