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 是标准弹簧安全过滤器,配置为:

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

如果需要,我可以提供经过清理的 customHeaderFilter,但此时控件永远不会到达过滤器,因此对于其中发生的事情无关紧要。

任何帮助/指导将不胜感激。

4

1 回答 1

1

感谢来自@Maksym 的指针,通过将customHeaderFilter 中的'after' 更改为'before' 解决了问题,如下所示:

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

FilterSecurityInterceptor 负责处理 HTTP 资源的安全性,包括应用角色检查。在我的情况下,X509Filter 会触发设置主体,但不会设置任何权限。这将导致拦截器拒绝访问资源,并且 headerFilter 甚至不会出现。

通过将 headerFilter 的位置设置为拦截器允许使用给定权限正确设置安全上下文中的主体和身份验证对象之前的位置,从而导致预期的行为。

于 2013-03-18T19:17:45.427 回答