3

spring security xml で次の構成を使用して、CloudFoundry で自分のアプリケーションにアクセスしようとしました

<intercept-url pattern="/signup*" access="permitAll" requires-channel="https" />

しかし、それは私にエラーを与えますこのウェブページにはリダイレクトループがあります

ただし、に変更するとrequires-channel="http"、自分のページが正常に表示されます。どちらの場合もhttps、アプリケーションで使用しました。これは予想される動作ですか?

4

3 に答える 3

7

まず、一歩下がって、これ ( https://johnpfield.wordpress.com/2014/09/10/configuring-ssltls-for-cloud-foundry/ ) は、問題の性質に関する優れたコンテキストを提供します。

重要な段落は

「ここでの脅威モデルは、クラウドへのエントリ ポイントが高可用性で安全なプロキシ サーバーであるということです。トラフィックがその境界を通過すると、信頼できるサブネットになります。実際、Tomcat アプリケーション サーバーが実行されている実際の IP アドレスとポート番号は、クラウドの外部からは見えません。そのポートへの HTTP 要求を取得する唯一の方法は、セキュア プロキシを経由することです。このパターンは、セキュリティ アーキテクチャの実践者の間で確立されたベスト プラクティスです。」</p>

したがって、SSL を完全に使用したくない、または必要としない場合がありますが、Cloud Foundry にデプロイされた Spring Security を使用するときに https リダイレクトの問題を回避する方法を確認するために読んでください。

Cloud Foundry インストールの境界で、ロード バランサー、HAProxy、または SSL を終了する何らかの種類のプロキシを使用します。慣例として、使用しているものはすべて、X-Forwarded-For および X-Forwarded-Proto ヘッダーを設定するように構成する必要があります。リクエスト ヘッダー「X-Forwarded-Proto」には、元のリクエストに応じて値 http または https が含まれます。このヘッダー パラメータを使用して、スタックのさらに下にあるセキュリティの決定を行う必要があります。

これを行う最もクリーンな方法はコンテナー レベルであるため、Spring Security はデプロイ コンテナーとは無関係に同じように動作します。これを構成するためのいくつかの典型的なオプションは次のとおりです

1) トムキャット

ここでうまく説明されているように、TomcatはRemoteIPValveで構成する必要があります

Cloud Foundry 用の Java ビルドパックは、ここに示されているように、すでにこれを行っています。

2) スプリング ブート (組み込み Tomcat)

Tomcat が組み込まれているため、Java ビルドパックの Tomcat 構成はアクティブ化されず (ビルドパックの検出基準を参照)、内部 Spring Boot 構成が必要になります。幸いなことに、Spring Boot で期待されるように構成するのは非常に簡単で、Tomcat の RemoteIPValve を有効にすることができます

server.tomcat.remote_ip_header=x-forwarded-for

server.tomcat.protocol_header=x-forwarded-proto

どちらのアプローチも、Tomcat バルブが ServletRequest.isSecure() の動作をオーバーライドするという同じ結果につながるため、アプリケーションはプロキシの使用法を認識できません。バルブは、「X-Forwarded-Proto」ヘッダーが設定されている場合にのみ使用されることに注意してください。

または、本当に低レベルに行きたい場合は、ここで示されているように、Spring Security の根幹を掘り下げることができます。その取り組みの一環として、https:// github.com/BroadleafCommerce/BroadleafCommerce/issues/424

追加のメモとして、CloudFlare は SSL を終了するリバース プロキシとしても機能し (これは、ここで説明されている PWS 経由の推奨されるアプローチです) 、関連するヘッダーを実際に転送します

参考文献

https://stackoverflow.com/a/28300485/752167

http://experts.hybris.com/answers/33612/view.html

https://github.com/cloudfoundry/java-buildpack/commit/540633bc932299ef4335fde16d4069349c66062e

https://support.run.pivotal.io/entries/24898367-Spring-security-with-https

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-use-tomcat-behind-a-proxy-server

于 2015-12-21T15:36:28.507 に答える
0

Spring Security を使用して HTTPS でページを保護しようとしたときに、同じ問題が発生しました。

CloudFoundry サポートに関する議論から、彼らは「ルーターで SSL 接続を終了する」ようです。「 SSL (HTTPS) 経由でアプリケーションにアクセスできますか? 」を参照してください。

そして、1年以上経っても、この問題に関してこれ以上の情報は見つかりません.

于 2013-05-07T17:05:04.020 に答える
0

それでも役立つ場合に備えて...この投稿がこれに似た問題を解決する手がかりを与えていることがわかりました。

問題は、org.springframework.security.web.access.channel.SecureChannelProcessor Bean が ServletRequest.isSecure() を使用して、接続を受け入れるかリダイレクトするかを決定することで、クラウド内で混乱していました。

その Bean に対する次のオーバーライドは、BlueMix でジョブを実行するように見えました - $WSSC 要求ヘッダーがすべての環境に適用されるかどうかはわかりません。

@Component
public class ChannelProcessorsPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(final Object bean, final String beanName) throws BeansException {
        if (bean instanceof SecureChannelProcessor) {
            final SecureChannelProcessor scp = (SecureChannelProcessor) bean;
            return new ChannelProcessor() {
                @Override
                public void decide(FilterInvocation invocation,
                        Collection<ConfigAttribute> config) throws IOException,
                        ServletException {
                    HttpServletRequest httpRequest = invocation.getHttpRequest();
                    // Running under BlueMix (CloudFoundry in general?), the
                    //   invocation.getHttpRequest().isSecure() in SecureChannelProcessor
                    //   was always returning false
                    if ("https".equals(httpRequest.getHeader("$WSSC"))) {
                        return;
                    }
                    scp.decide(invocation, config);
                }

                @Override
                public boolean supports(ConfigAttribute attribute) {
                    return scp.supports(attribute);
                }
            };
        }

        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException {

        return bean;
    }
}
于 2014-06-10T22:30:57.783 に答える