2

我有一个带有两个 servlet 和与每个 servlet 关联的多个映射的 Web 应用程序,即

web.xml

<servlet-mapping>
    <servlet-name>cheese</servlet-name>
    <url-pattern>/edam/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>cheese</servlet-name>
    <url-pattern>/cheddar/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>dog</servlet-name>
    <url-pattern>/poodle/*</url-pattern>
</servlet-mapping>
...

我现在想将 Spring Security 应用到这个 Web 应用程序,为每个servlet使用不同的安全配置。这是因为 servlet 具有不同的身份验证要求。因此,我希望只有两个过滤器映射:

<filter-mapping>
    <filter-name>springSecurityFilterChainCheese</filter-name>
    <servlet-name>cheese</servlet-name>
</filter-mapping>
<filter-mapping>
    <filter-name>springSecurityFilterChainDog</filter-name>
    <servlet-name>dog</servlet-name>
</filter-mapping>

使用 Spring Security 3.1,我能够定义多个<http>元素,这看起来是个不错的方法。但是,我看不到如何为每个<http>元素指定 bean 名称或将元素映射到 servlet 的任何其他方式。

我知道我可以在 上指定一个pattern属性<http>,但是我需要在我的 Spring Security 配置中重复 servlet 到 URL 的映射,这不是 DRY。

如何将<http>元素映射到这样的特定 servlet?或者我是否需要扩展<http>元素并自己定义我所有的 Spring Security bean?

4

2 回答 2

1

从您的示例中不确定,但您真的需要两个过滤器吗?

你读过http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-minimal吗?这可以让你朝着正确的方向前进。

您可以在单个元素中包含多个元素;那对你有用吗?我不知道有任何其他方式来做你所要求的。请记住将最具体的规则放在顶部,因为这是它们将被评估的顺序。

有时你不能有一个完全 DRY 的解决方案,至少它不是代码。如果您真的很担心,请使用诸如 Ant 之类的机制来填写 servlet 名称和模式元素。

于 2012-06-21T21:32:25.887 回答
1

查看 Spring Security 的源代码,似乎可以通过在元素上提供idor来实现,但 Spring Security XML 模式阻止了这种情况!我相应地提出了https://jira.springsource.org/browse/SEC-1978name<http>

于 2012-06-25T13:56:58.557 回答