2012-12-10 118 views
3

我下面這個教程: http://www.mkyong.com/spring-security/spring-security-hello-world-example/Spring Security的過濾器有多個URL攔截映射

spring-security-xml

<http auto-config="true"> 
    <intercept-url pattern="/welcome*" access="ROLE_USER" /> 
</http> 

而在web.xml中,我們必須定義實際濾波器

<!-- Spring Security --> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class> 
       org.springframework.web.filter.DelegatingFilterProxy 
      </filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

所以我沒有得到這個,我們在兩個地方將截取映射到2個URL。到/welcome*/*。爲什麼我們需要這兩個?我在這裏錯過了什麼嗎?

回答

9

DelegatingFilterProxy不是Spring Security類。它來自Spring Web包。

標準Servlet的代理2.3過濾器,委託給 實現Filter接口的Spring管理bean。在web.xml中支持 「targetBeanName」過濾器init-param,在Spring應用程序上下文中指定目標bean的名稱 。

當您使用

<http auto-config="true"> 

</http> 

春季安全創建(隱含的)與名springSecurityFilterChain(這就是爲什麼你在web.xml<filter-name>springSecurityFilterChain</filter-name>)和所有請求(/*)豆,它處理的(Spring Security中)。

然後你配置Spring Security並給它更具體的URL(/*welcome)。

<intercept-url pattern="/welcome*" access="ROLE_USER" /> 

這就像說:

  • 所有URL請求(/*)應該由Spring Security的調查
  • 當URL匹配/welcome*校長應該有ROLE_USER作用。

如果您的應用程序需要更高級的安全處理,您可以自己創建該過濾器鏈接bean並手動配置所有過濾器。

實施例:

<!-- Filter Chain --> 
<bean id="springSecurityFilterChain" 
     class="org.springframework.security.web.FilterChainProxy"> 
    <constructor-arg> 
     <list> 
      <sec:filter-chain pattern="/favicon.ico" 
           filters="none"/> 

      <sec:filter-chain pattern="/img/**" 
           filters="none"/> 

      <sec:filter-chain pattern="/**" 
       filters="bannedIPsFilter, <!-- custom filter --> 
         channelProcessingFilter, 
         securityContextPersistenceFilter, 
         concurrentSessionFilter, 
         logoutFilter, 
         secondAuthenticationFilter, <!-- custom filter --> 
         openIDAuthenticationFilter, 
         usernamePasswordAuthenticationFilter, 
         anonymousAuthenticationFilter, 
         captchaFilter, <!-- custom filter --> 
         sessionManagementFilter, 
         exceptionTranslationFilter, 
         filterSecurityInterceptor, 
         switchUserProcessingFilter" 
        /> 
     </list> 
    </constructor-arg> 
</bean> 
+1

好的和徹底的答案 - 必須對OP有幫助。 –

+0

謝謝你的好話! –

+0

很棒的回答。當一個URL匹配多個過濾器鏈映射時會發生什麼。第一個是唯一使用的嗎? –

0

springSecurityFilterChain是該過濾器鏈中的所有彈簧安全過濾器的外觀。它在web.xml中被註冊爲獨立的servlet過濾器。

/welcome* - 是特定於spring-security的「內部」過濾器的配置,它不存在於web.xml中,並且servlet容器不知道它的任何內容。