web-dev-qa-db-ja.com

RedirectViewがHTTPS / SSLで使用された後、SpringのSecurityContextHolder.getContext()。getAuthentication()はnullを返します

私はTomcatで実行されている典型的なSpringMVCを持っています。システムをHTTPSで実行するように切り替えた後(プレーンHTTPではすべてが正常に機能しています)、ログインは機能しなくなりました。その理由は、nullが使用された後、SpringのSecurityContextHolder.getContext().getAuthentication()オブジェクトがRedirectViewになるためです。

私はすでに答えを探しました、私が見つけた唯一のものはプロパティを設定することを提案しましたredirectHttp10Compatible to falseviewResolverbeanセットアップ。これは役に立ちませんでした。

また、リダイレクト全体を通して、セッション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" />
10
Dima Suba

リダイレクト後にnullになるSecurityContextHolder.getContext().getAuthentication()はスレッドバインドされているため、正しいです。ただし、セッションから再入力する必要があります。したがって、セッション内のSPRING_SECURITY_CONTEXT属性を追跡するようにしてください。アイデアを得るためのサンプルコードを次に示します。

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

Spring Securityのドキュメントには、HTTPS/HTTPスイッチングがセッションを台無しにする方法についてのパートがあり、おそらくどこかに問題のヒントがあります。 http://static.springsource.org/spring-security/site/faq.html#d0e22

上記のFAQは、アプリケーションでのセッションの処理方法の調査につながります。おそらく、AuthenticationSuccessHandlerの実装を検討し始めます(必要に応じて、質問に挿入できます)。

Webアプリケーションでセキュリティコンテキストがどのように処理されるかについての詳細は、以下を参照してください。(セクション5.4): http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ Technical-overview.html

26
Carsten