0

SpringSecurityCASを使用して保護されたWebアプリがあります。CASサーバーとWebアプリは、リバースプロキシ(urlという名前)用のWebサーバーの背後にあります。WebアプリはServiceAuthenticationDetailsS​​ourceを使用して動的サービスURLを認証します。私が抱えている問題は、検証中に提供されたURLが、チケットの作成時に提供されたURLと一致しないため、サービスチケットの検証が失敗することです。システムがhttps://:/を使用して接続されている場合、セットアップはWebサーバーなしで機能します。

問題は、WebサーバーがWebアプリケーションにリダイレクトするときにHttpServletRequestを変更し、そこで「名前付きURL」情報が失われ、とに置き換えられることであると思われます。サービスチケットは、ログイン時に「?service=」を介して指定されたURLを使用して取得されます。

考えられる解決策はありますか?特に自己識別型のアプリケーションや、CASがクライアントIPアドレスを記録しようとしているセキュリティ上の理由から、apacheは要求を変更せずに再ルーティングできますか?

4

1 に答える 1

1

以下にいくつかのオプションの概要を示します。

リバースプロキシを設定する

ServletRequestのJavadocによると、HttpServletRequest.getServerName()は次のようになります。

ホストヘッダー値の「:」の前の部分の値(存在する場合)、または解決されたサーバー名、またはサーバーのIPアドレス。

これは、ホストヘッダーが適切に設定されるようにプロキシーを構成できることを意味します(ただし、WebSphereなどの一部のコンテナーは仕様を尊重しません)。

コンテナ構成を使用してオーバーライド

多くのサーバーには、リバースプロキシを使用している場合にこの値を上書きできる設定があります。Springフォーラムにはかなりまともなスレッドがあり、以下に要約した情報がもう少しあります。

Tomcatを使用している場合は、リバースプロキシの設定ページを参照してください。構成の1つの方法は、HttpServletRequest.getServerName()によって返される値をオーバーライドするproxyName属性と、HttpServletRequest.getServerPort()によって返される値をオーバーライドするproxyPortを持つようにHttpコネクターを構成することです。構成例は次のようになります。

server.xml

<Connector scheme="https" secure="true" 
    proxyPort="443" proxyName="example.com"
    port="8009" protocol="AJP/1.3"
    redirectPort="8443" maxThreads="750" 
    connectionTimeout="20000" />

Websphereには、同じことを行うカスタムプロパティがいくつかあります。

com.ibm.ws.webcontainer.extractHostHeaderPort = true
trusthostheaderport = true
httpsIndicatorHeader = com.ibm.ws.httpsIndicatorHeader

これらのコンテナのいずれも使用していない場合、または複数のドメインをサポートする必要がある場合は、コンテナのドキュメントを参照する必要があります。

カスタムAuthenticationDetailsS​​ource

もちろん、Spring Securityは非常に柔軟性があるため、任意の方法でサービスURLを検索するServiceAuthenticationDetailsのインスタンスを返すAuthenticationDetailsS​​ourceのカスタム実装をいつでも提供できます。

于 2013-02-01T16:52:44.217 に答える