2013-03-18 102 views
0

我使用Spring安全有兩個過濾器: - 爲客戶端證書X.509認證一個過濾器。他所有的過濾器都是從證書中提取用戶名的原則。 - 一個過濾器來執行基於頭的身份驗證。標題應該有用戶名和角色。在這個過濾器中,我檢查以確保安全上下文中已經存在一個主體。如果存在,我確保它匹配標題中的內容。然後我從頭文件中提取角色並設置授予的權限。 我有一個url模式,我想讓角色可以訪問 - 'ROLE_USER'春季安全與多個自定義過濾器和角色

現在是問題所在。該請求僅碰到第一個過濾器(X.509),顯然該頭部中缺少該角色,並且訪問被spring安全性拒絕。

我不能切換過濾器的順序,因爲如果我這樣做,然後由彈簧提供X.509過濾器看到的都只是本金已經存在,所以沒有任何使其失去作用。

有沒有辦法對被推遲的角色檢查,直至所有的過濾器進行處理?或者以其他任何方式來實現我正在嘗試做的事情。

這裏是我的春天的安全配置:

<security:http auto-config="true" entry-point-ref="customEntryPoint"> 
    <security:intercept-url pattern="/user/**" access="ROLE_USER"/> 
    <security:custom-filter after="EXCEPTION_TRANSLATION_FILTER" ref="x509Filter" /> 
    <security:custom-filter after="FILTER_SECURITY_INTERCEPTOR" ref="headerFilter"/> 
</security:http>  

其中x509Filter是標準的Spring Security過濾器配置爲:

<beans:bean id="x509PrincipalExtractor" class="org.springframework.security.web.authentication.preauth.x509.SubjectDnX509PrincipalExtractor"> 
    <beans:property name="subjectDnRegex" value="CN=(.*?),"/> 
</beans:bean> 

我可以提供,如果需要擦洗了customHeaderFilter但在這一點上控制永遠不會到達過濾器,因此它對於發生的事情是無關緊要的。

任何幫助/指導將不勝感激。

+0

爲什麼你不使用[X509](http://static.springsource.org/spring-security/site/docs/3.2.x/reference/springsecurity-single.html#d0e8028)標籤基於接通證書認證? – 2013-03-18 16:57:45

+0

我不記得確切,但我在訂購過濾器時遇到了問題,並能夠在使用x509和我的自定義過濾器時處理異常。同樣的原因,導致我添加自定義'後'位置。即使我這樣做了,但是在這種情況下會有所作爲嗎? – MickJ 2013-03-18 17:14:29

+1

我不確定這可以解決這種情況。對我來說看起來很奇怪的是你的過濾器的位置。從官方文檔看,preauth過濾器的正確位置是PRE_AUTH_FILTER(和x509的X509_FILTER)。你有沒有嘗試在X509_FILTER位置注入x509並在PRE_AUTH_FILTER上自定義一個? – 2013-03-18 17:52:35

回答

1

感謝來自@Maksym指針,這個問題是通過改變「後」解析爲「前」在customHeaderFilter如下:

<security:custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="headerFilter"/> 

FilterSecurityInterceptor負責處理HTTP資源的安全性,包括應用角色檢查。在我的情況下,X509Filter會觸發設置主體,但不會設置任何權限。這會導致攔截器拒絕對資源的訪問,而headerFilter甚至不會出現在圖片中。

通過headerFilter的位置設置到攔截器允許的安全上下文的本金和驗證對象之前,必須正確設置與給定的當局,導致預期的行爲。