2012-03-28 15 views
7

私は春のセキュリティがインストールされ、うまく動作するアプリケーションを持っています - それは現在www.exampledomain.comを使い果たしています。Javaスプリングセキュリティ - 別のログイン用のサブドメインURLを傍受しますか?

サブドメインが不足しているアプリケーションを展開したいと考えています。例えば、newapp.exampledomain.com

唯一の問題は、この新しいアプリをユーザーがログインする必要があることです。春には<intercept-url pattern="/Admin/*" access="ROLE_GENERAL"/>

経由でURLを傍受することは非常に簡単ですが、あなたは、ログインのためのサブドメインをインターセプトしたいとき、あなたは何をしますか?たとえば、私のために、次のdoesntの仕事:この問題を回避する方法について

<intercept-url pattern="http://newapp.exampledomain.com/*" access="ROLE_GENERAL"/> 

任意の考え?

+0

あなたがサブドメインではなく、異なるWebアプリケーションで同じWebアプリケーションを使用していますか? – Qwerky

+0

サブドメインチェックを追加するために 'FilterSecurityInterceptor'を上書きするかもしれませんが、実際の解決策ではなく、ハックのようなにおいがします。すぐに使えるソリューションについて質問をアップアップしてください。また、web-app/web-containerサブドメインの設定について、より具体的なものにすることもできます。 – alexkasko

+0

Yeh異なるサブドメインに同じアプリを使用すると、異なるサブドメインはユーザーとは異なる機能を表しますが、同じサーバーがそれを処理します(費用対効果の理由から)。 Webアプリケーションコンテナのサブドメインconfigでは、フィルタが呼び出されてサブドメインが呼び出されたことを検出し、その要求がそのドメインの機能に対して関連するアクションに転送されます。すべての人がアクセスできるfree.domain.comと、機能が追加された、より見栄えの良いpro.domain.comを想像してみてください。 –

答えて

2

1つのオプションは、RoleVoterを拡張する独自のAccessDecisionVoterを作成し、ホスト名に基づいて追加のチェックを追加することです。このような何か:

public class MyVoter extends RoleVoter { 
    public int vote(Authentication authentication, 
       java.lang.Object object, 
       java.util.Collection<ConfigAttribute> attributes) { 
    FilterInvocation filterInvocation = (FilterInvocation) object; 
    HttpRequest request = filterInvocation.getHttpRequest(); 
    // get subdomain from request 
    String subdomain = getSubdomain(request); 
    if ("free".equals(subdomain)) { 
     return ACCESS_GRANTED; 
    } 
    else { 
     super.vote(authentication, object, attributes); 
    } 
    } 
} 

その後、あなたの投票をアップワイヤー:

<security:http auto-config="true" 
       use-expressions="true" 
       access-decision-manager-ref="accessDecisionManager"> 
... 
</security:http> 

<bean id="accessDecisionManager" 
     class="org.springframework.security.access.vote.UnanimousBased"> 
    <property name="decisionVoters"> 
     <list> 
      <bean class="com.acme.MyVoter" /> 
     </list> 
    </property> 
</bean> 

あなたはさらに一歩それを取るしたい場合は、また、あなたがハードコーディングされたホスト名のチェックを外すことが可能になるそのconfiguration attributesあなた自身を書くことができ有権者とような何か:あなたのセッションクッキーで

<intercept-url pattern="/Admin/*" access="ROLE_GENERAL" domain="free.acme.com" /> 
+0

intercept-urlタグは、「ドメイン」という名前の属性を取得しません。有権者を使用することは真実かもしれませんが、この解決法は決してうまくいかないでしょう。 – tugcem

1

を、ドメインが明示的にexampledomain.comに設定する必要があります。

アプリケーションサーバーはセッションCookieの作成(JSESSIONID)を担当しますが、Spring Securityは担当しません。

あなたがしなければならないことは、いつも同じドメインをクッキーに入れたいとアプリサーバーに通知することです。

は、あなたのweb.xmlに追加します。

<session-config> 
     <cookie-config> 
      <domain>exampledomain.com</domain> 
     </cookie-config> 
    </session-config> 
関連する問題