2012-04-30 96 views
31

私はSpringセキュリティで保護されたSpring WebアプリケーションをEC2で実行しています。 EC2インスタンスの前にSSL証明書を持つElastic Load Balancerがあります(httpsはロードバランサ、つまりポート443 - >ポート80で終了します)。したがって、Tomcatの観点からは、受信リクエストはHTTPです。Spring SecurityでHTTPSログインがHTTPにリダイレクト

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

私のログイン設定がそうのようになります。私はデフォルト・ターゲットURLを作るために変更する必要が何

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

authentication-failure-urlはhttpsに移動しますか?私はこの作業を得た

  • のTomcat 6
  • 春のセキュリティ3.0.xの
+0

私は、Apache Rewriteを設定しましたが、Spring Securityの設定内で行う方法があるかどうか不思議です。 – Thody

+0

通常はロードバランサで行われ、設定はurl-rewriteと呼ばれます。この方法では、ロードバランサはリダイレクトがhttpsのままであることを確認します。 – Ritesh

答えて

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をハードコードする必要があるため、理想的な方法ではありません。

0

すべてのインターセプトURLでrequires-channel = "any"を設定しました。これは、SSLを使用しない私の開発環境でも動作します。

<intercept-url pattern="/createUser" access="permitAll" requires-channel="any"/> 
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" requires-channel="any"/> 
<intercept-url pattern="/**" access="isAuthenticated()" requires-channel="any"/> 

次に、すべてのトラフィックをHTTPSバージョンにリダイレクトするApache仮想ホストを作成します。

<VirtualHost *:80> 
    ServerName www.mywebsite.com 
    Redirect permanent/https://www.mywebsite.com/ 
</VirtualHost> 
+5

ログイン後、Springは引き続きhttpアドレスを持つLocationヘッダーを送信します。あなたのApacheは即座にhttpsにリダイレクトされるため、ユーザーは気付かないでしょうが、ブラウザが安全でないチャンネルでセッションCookieを送信するため、セキュリティ上の重大な問題です。 – marcelj

+0

@marcelj - 私はちょうど火かぶりを通してそれを実行し、あなたは正しいです。より良い解決策を見つけ出し、私の答えを修正しようとします。 –

+0

@marcelj、なぜこれが重大なセキュリティ上のリスクであるのか、またはそのリスクを説明するリファレンスを提供することができますか? –

19

春の設定は、使用されているプロトコルに依存しないようにする必要があります。 "require-channel"のようなものを使用すると、特に同じアプリケーションをhttpsなしの開発環境にデプロイする場合には、すぐに問題が発生します。

代わりに、正しくtomcatを設定することを検討してください。 RemoteIpValveでこれを行うことができます。

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

春のServletRequestに基づいて、絶対リダイレクトアドレスを決定しますので、あなたがより何か他のものを使用している場合はhttpsServerPortを変更します。これによって、あなたのserver.xml構成は、次のようなものが含まれている必要があり、ロードバランサーが送信ヘッダ443:protocolHeaderが示す場合

httpsServerPortは ServletRequest.getServerPort()によって返されたポートであるHTTPSプロトコル

0

私はまったく同じ問題に直面しており、適切な解決策が得られるまでは、プロキシサーバーからHTTPの代わりにAJPを介してTomcatサーバーにリクエストをリダイレクトしています。 以下は私のApache設定です

ProxyPass /myproject ajp://localhost:8009/myproject 
ProxyPassReverse /myproject ajp://localhost:8009/myproject 
0

以下のコード行をwebで使用してください。XML

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name>Login and Restricted Space URLs</web-resource-name> 
    <url-pattern>/j_security_check</url-pattern> 
    <url-pattern>/loginpage.rose</url-pattern> 
    </web-resource-collection> 
    <user-data-constraint> 
    <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

はそれがHTTPSを使用するように強制できます。

関連する問題