2

奇妙なもの、

私はsiteminderでスプリングセキュリティを使用していますが、正常に動作します。ただし、保護されていないURLが1つ必要です。loadBalancerには、アプリ自体に「healthCheck」URLが必要です。このURLはsiteminderによって傍受されませんが、SpringSecurityはとにかく事前認証を適用しているようです。

単純なフォームベースのセキュリティ構成を使用してローカルで実行すると、次のように機能します(フィルターを除く)。

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/html/healthCheck.html" filters="none" />   
    <intercept-url pattern="/css/**" filters="none" />
    <intercept-url pattern="/images/**" filters="none" />
    <intercept-url pattern="/js/**" filters="none" />
    <intercept-url pattern="/login" filters="none" />
    <intercept-url pattern="/favicon.ico" filters="none" />
    <intercept-url pattern="/*" access="hasAnyRole('ROLE_USER')" />
    <form-login login-page="/login" default-target-url="/" authentication-failure-url="/loginfailed" />
    <logout logout-success-url="/logout" />
</http>

この場合、認証の問題を発生させることなくlocalhost / myApp / resources / html / healthCheck.htmlを参照できますが、他のURLにはログインフォームが表示されます。これまでのところ、すべて良さそうです!

ただし、サーバーにデプロイするときは、次の構成を使用しています。

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/html/healthCheck.html" filters="none" />   
    <intercept-url pattern="/css/**" filters="none" />
    <intercept-url pattern="/images/**" filters="none" />
    <intercept-url pattern="/js/**" filters="none" />
    <intercept-url pattern="/login" filters="none" />
    <intercept-url pattern="/favicon.ico" filters="none" />
    <intercept-url pattern="/*" access="hasAnyRole('ROLE_USER')" />
    <custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</http>

server / myapp / resources / html / healthCheck.htmlにアクセスすると、次のエラーが発生します。

java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor
    org.springframework.security.core.userdetails.User.<init>(User.java:94)
    com.myApp.security.SecuritySBSUserDetailsService.loadUserByUsername(SecuritySBSUserDetailsService.java:119)
    org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper.loadUserDetails(UserDetailsByNameServiceWrapper.java:53)

これは、UserDetailsS​​erviceがSM_USERなしでインスタンス化されたことが原因だと思います。それでも、filters = noneが設定されており、フォーム認証を使用するときに機能します。これを引き起こしている可能性のある、またはより良い回避策について何か考えはありますか?

ちなみに、私のuserdetailsサービスは次のように構成されています。

<beans:bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
    <beans:property name="principalRequestHeader" value="SM_USER" />
    <beans:property name="exceptionIfHeaderMissing" value="false" />
    <beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>

つまり、それが役立つ場合は、exceptionIfHeaderMissingをfalseに設定しました。

4

2 に答える 2

2

私が見ることができる最も明白なことは、/resources/html/healthCheck.htmlと一致しないこと/html/healthCheck.htmlです。どこかで URL を書き換えている場合は、おそらくそれを説明する必要があります。

デバッグ ログを有効にすると、何が何と一致するかを詳細に説明する必要があります。

も省略しauto-configます。それは価値があるよりも多くの混乱を引き起こします。また、普遍的なアリ パターン マッチで/**はなく、を使用する必要があります。/*

ここで、Spring Security 3.1 には空のフィルター チェーンを定義するためのより優れたアプローチが<http>あり、構文を使用して複数のフィルター チェーンを定義できることもおそらく言及する価値があります。

于 2012-05-16T21:33:12.327 に答える
0

さて、私が見る限り、春のセキュリティのバグのようです。UserDetailsS​​ervice の loadUserByName メソッドの先頭にダミーのリターンを追加することで回避しました。

@Override
public UserDetails loadUserByUsername(String userName)
        throws UsernameNotFoundException, DataAccessException {
    logger.trace(">> loadUserByUsername()");
    logger.info("-- loadUserByUsername(): username : {}", userName);

    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();             
    if(userName==null || userName.trim().equals("")) {
        return(new User("ANONYMOUS", "", true, true, true, true, authorities));
        }
// rest of auth checks

私が持っている設定では、 UserDetails チェックがまったくトリガーされないように思われます(フォームの場合と同様に..)。誰かが構成ベースの回避策を持っている場合、私はあなたにプラスを与えます:-)

于 2012-05-16T18:14:01.453 に答える