2012-03-21 141 views
2

我有一個具有spring安全性的web應用程序,默認情況下所有頁面都需要授權。在我的情況下,管理員可以在某些時候決定禁用某些頁面的安全性或完全禁用它。這怎麼能最好地實現?我正在考慮修改FilterChainProxy,但是我不清楚究竟如何(getFilterChains()返回一個不可修改的列表)?以編程方式禁用Spring Security

+0

首先,您的配置看起來很不尋常,因爲* everything *似乎受到保護,包括登錄頁面(通常不是)。 您能解釋一下管理員可以禁用頁面安全的情況嗎?看起來不尋常和有趣的同時。 – 2012-03-21 15:52:36

+0

那麼它使用http-basic,因此使用默認的瀏覽器驗證對話框。該應用程序是一種數據庫搜索/瀏覽/服務器,並且由於默認情況下所有內容都受到保護,因此管理員可能需要/決定公開它(例如,由於需要與應用程序通信但不支持身份驗證的第三方應用程序) 。 – kpentchev 2012-03-21 17:51:12

回答

3

子類DelgatingFilterProxy和檢查標誌是否調用委託與否。

然後在您的web.xml中使用該代替用於springSecurityFilterChain(假設您正在使用命名空間配置)的DelegatingFilterProxy。例如:

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>com.foo.spring.MyDelegatingFilterProxy</filter-class> 
</filter> 

在你的DelegatingFilterProxy檢查標誌(例如,系統屬性),看看你是否應該委託與否。

class MyDelegatingFilterProxy extends DelegatingFilterProxy { 

    override def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { 

    if (System.getProperty("skipSpringSecurity" != null) { 
     // Ignore the DelegatingProxyFilter delegate 
     chain.doFilter(request, response) 
    } else { 
     // Call the delegate 
     super.doFilter(request, response, chain) 
    } 
    } 
} 

您可以使用相同的技術來使用毯子通配符像<security:intercept-url pattern="/**" access="ROLE_USER" />然後跳到呼籲下/有一套路徑的春季安全過濾器(靜態文件等)。

+0

非常感謝,這就是我一直在尋找的東西,它的效果非常好! – kpentchev 2012-03-22 09:27:54

0

Spring Security如何配置?你可以選擇添加一個自定義permissionEvaluator來驗證你的條件?

看一看spring-security writing a custom PermissionEvaluator - how to inject a DAO service?

+0

我有一些特定的選民和AuthenticationProvider的,但除此之外,它使用默認的Web應用程序配置'<安全:HTTP自動配置=「真」 \t \t認證經理-REF =「AuthenticationManager會」 \t \t訪問決策管理-ref = 「repositoryAccessDecisionManager」 \t \t存取遭拒頁= 「/存取遭拒」> \t \t \t \t <安全:截距-URL模式= 「/ **」 訪問= 「ROLE_USER」/> \t \t <安全:http-basic /> \t kpentchev 2012-03-21 14:44:33