我使用Spring安全性和两个过滤器: - 一个用于客户端证书的x.509身份验证的过滤器。他所有的过滤器都是从证书中提取用户名。 - 一个用于执行基于标头的身份验证标头应具有用户名和角色。在此过滤器中,我检查以确保安全上下文中已存在主体。如果存在,我确保它匹配标题中的最新内容。然后我从标题中提取角色并设置授予的权限。 我有一个url模式,我想让角色可以访问 - 'ROLE_USER'
现在问题就在于此。该请求仅访问第一个过滤器(X.509),显然该标题中缺少该角色,并且Spring安全性拒绝访问。
我无法切换过滤器的顺序,因为如果我这样做,那么Spring提供的X.509过滤器只会看到主体已经存在并且没有做任何事情使它变得无用。
在处理完所有过滤器之前,是否有任何方法可以延迟角色检查?或任何其他方式来实现我想要做的事情。
这是我的spring security配置:
<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,但此时控件永远不会到达过滤器,因此它无关紧要。
非常感谢任何帮助/指导。
答案 0 :(得分:1)
感谢来自@Maksym的指针,通过在customHeaderFilter中将'after'更改为'before'来解决问题,如下所示:
<security:custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="headerFilter"/>
FilterSecurityInterceptor负责处理HTTP资源的安全性,包括应用角色检查。在我的情况下,X509Filter会触发设置主体,但不会设置任何权限。这会导致拦截器拒绝访问资源,而headerFilter甚至不会进入图片。
通过将headerFilter的位置设置为拦截器允许安全上下文中的主体和身份验证对象与给定权限正确设置,从而导致预期的行为。