2012-05-16 50 views
0

奇怪的一個,Spring Security Preauth「filters = none」not working

我使用siteminder彈簧安全,它工作正常。不過,我想要一個不受保護的url - 我們的loadBalancer在應用程序本身中需要一個「healthCheck」url。此網址未獲通過的SiteMinder截獲,但春天安全似乎在預認證適用於它無論如何..

如果我運行它在本地使用一個簡單的基於表單的安全配置以下工作(不包括過濾器):

在這種情況下,我可以瀏覽到localhost/myApp/resources/html/healthCheck.html而不觸及授權問題,但任何其他網址都會顯示登錄表單。迄今爲止所有看起來不錯!

但是當我部署到服務器我使用以下配置:

<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> 

當我瀏覽到:服務器/ MYAPP /資源/ 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的情況下實例化引起的。然而,過濾器=沒有適當的位置..並且在使用表單身份驗證時有效。任何想法可能會導致這種情況,或者更好 - 解決方法?

順便說一句,我的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爲假,是否有幫助..

回答

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不應該得到所有觸發(因爲它是與形式..)。如果任何人有基於配置的解決方法,我會給你一個加號:-)

+1

從您問題中的信息看來,您似乎正在使用不匹配的路徑。沒有證據表明有錯誤。很多人使用這種構造,所以也不太可能以前沒有發現過如此明顯的東西。 –

2

我能看到的最明顯的是/resources/html/healthCheck.html不會被匹配/html/healthCheck.html。如果你在某處重寫URL,你應該可以解釋一下。

如果您啓用調試日誌記錄,它應該詳細解釋什麼與什麼匹配。

我也忽略了auto-config。它會導致更多的混亂,而不是值得的。您應該使用/**而不是/*進行通用螞蟻模式匹配。

在此可能還值得一提的是Spring Security 3.1 has a better approach用於定義空濾波器鏈,並且還允許您使用語法定義多個濾波器鏈。

相關問題