3

我正在关注本教程: http ://www.mkyong.com/spring-security/spring-security-hello-world-example/

在里面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 个地方的 2 个 url。到/welcome*/*。为什么我们需要这两个?我在这里错过了什么吗?

4

2 回答 2

9

DelegatingFilterProxy不是 Spring Security 类。它来自 Spring Web 包。

标准 Servlet 2.3 过滤器的代理,委托给实现过滤器接口的 Spring 管理的 bean。支持 web.xml 中的“targetBeanName”过滤器 init-param,在 Spring 应用程序上下文中指定目标 bean 的名称。

当你使用

<http auto-config="true">

</http>

Spring Security 创建(隐式)具有名称的 bean springSecurityFilterChain(这就是您<filter-name>springSecurityFilterChain</filter-name>在 中的原因web.xml)并且所有请求(/*)都由它(由 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>
于 2012-12-10T08:34:30.557 回答
0

springSecurityFilterChain是此过滤器链内所有弹簧安全过滤器的外观。它在 web.xml 中注册为单独的 servlet 过滤器。

/welcome*- 是特定于 spring-security 的“内部”过滤器的配置,它不存在于 web.xml 中,并且 servlet 容器对此一无所知。

于 2012-12-10T08:39:53.923 回答