具有filterSecurityInterceptor的Spring FilterChainProxy无法正常工作?

时间:2016-06-04 05:50:06

标签: java spring spring-mvc spring-security

我有一个带有配置文件的spring应用程序,如下所示。所有配置看起来都是正确的,但在调试时我发现,在初始化期间,为FilterSecurityInterceptor创建了两个没有任何拦截网址规则的bean,另一个用我指定的规则创建。 当请求到来时,它使用FilterSecurityInterceptor bean而没有intercept-url规则。所以我看到以下日志:

DEBUG FilterSecurityInterceptor:183 - Public object - authentication not attempted

但请求网址属于拦截网址规则。我调试并发现这是因为使用的bean在httpMethodMap的{​​{1}}中没有任何拦截规则。 我不确定这里有什么问题。

以下是DefaultFilterInvocationSecurityMetadataSource

applicationContext-security.xml

在此感谢任何帮助。

1 个答案:

答案 0 :(得分:7)

配置中有<security:http>个元素。来自文档:

  

<强> 38.1.2 <http>
  每个<http>命名空间块始终会创建SecurityContextPersistenceFilterExceptionTranslationFilterFilterSecurityInterceptor。这些是固定的,不能用替代品替代。

因此忽略了您的<bean id="filterSecurityInterceptor">。而不是

<bean id="filterSecurityInterceptor"
    class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
    <property name="securityMetadataSource">
        <security:filter-security-metadata-source>
            <security:intercept-url pattern="/login.htm*"
                access="ROLE_ANONYMOUS" />
            <security:intercept-url pattern="/**"
                access="ROLE_USER,ROLE_ADMIN" />
        </security:filter-security-metadata-source>
    </property>
    <property name="accessDecisionManager" ref="accessDecisionManager" />
    <property name="authenticationManager" ref="authenticationManager" />
</bean>

您应该更改<security:http>以包含类似

的内容
<security:http ...
        authentication-manager-ref="authenticationManager">
    ...
    <security:intercept-url pattern="/login.htm*"
        access="ROLE_ANONYMOUS" />
    <security:intercept-url pattern="/**"
        access="ROLE_USER,ROLE_ADMIN" />
</security:http>

您不需要<bean id="accessDecisionManager">,因为(docs)引用“默认情况下,AffirmativeBased实施用于RoleVoter和{{1 “,这正是你定义的。

此外,我们会忽略您的AuthenticatedVoter,而应将<bean id="securityContextFilter">属性添加到security-context-repository-ref="securityContextRepository"元素。
并且您的http被忽略,我不确定如何正确替换它。

您手动定义了很多<bean id="exceptionTranslator">个bean。我怀疑它们中的大部分都是不必要的(默认定义),或者应该使用org.springframework.security命名空间的专用元素来定义,而不是使用raw spring security: