51

EC2で実行されているSpringSecurityで保護されたSpringWebアプリがあります。EC2インスタンスの前にはSSL証明書を備えたElasticLoadBalancerがあり(httpsはロードバランサーで終了します。つまり、ポート443->ポート80)、Tomcatの観点からは、インバウンドリクエストはHTTPです。

ログインフォームはhttpsに送信されますが、その後のリダイレクトはhttpに送信されます(成功または失敗)。認証に成功し、httpsに戻ってログインできます。

私のログイン設定は次のようになります。

<security:form-login
    default-target-url="/home"
    login-page="/"
    login-processing-url="/processlogin"
    authentication-failure-url="/?login_error=1"/>

default-target-urlとauthentication-failure-urlをhttpsに移動するには、何を変更する必要がありますか?

  • Tomcat 6
  • Spring Security 3.0.x
4

10 に答える 10

30

春の構成は、使用されるプロトコルに依存しない必要があります。「requires-channel」のようなものを使用すると、遅かれ早かれ問題が発生します。特に、同じアプリケーションを https なしで開発環境にデプロイする場合はそうです。

代わりに、Tomcat を適切に構成することを検討してください。これはRemoteIpValveで実行できます。ロードバランサーが送信するヘッダーに応じて、server.xml 構成に次のような内容を含める必要があります。

<Valve
   className="org.apache.catalina.valves.RemoteIpValve"
   internalProxies=".*"
   protocolHeader="X-Forwarded-Proto"
   httpsServerPort="443"
   />

Spring は ServletRequest に基づいて絶対リダイレクト アドレスを決定するため、443 以外のものを使用している場合は httpsServerPort を変更します。

httpsServerPort は、protocolHeader が https プロトコルを示している場合に ServletRequest.getServerPort() によって返されるポートです。

于 2014-02-04T14:03:08.883 に答える
2

これを機能させる1つの方法は、次の構成を追加することです。

<http auto-config="true" use-expressions="true" entry-point-ref="authenticationEntryPoint" >
    <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?login_error=t" always-use-default-target="true" default-target-url="xxxxx" />
    <logout logout-url="/logout" logout-success-url="/logoutSuccess.jsf" />
    ...
</http>

追加する必要がalways-use-default-target="true"ありdefault-target-url="https://...."ました。構成にURLをハードコーディングする必要があるため、理想的な方法ではありません。

于 2012-09-09T01:09:37.597 に答える