【问题标题】:Spring security error with access-denied-handler tag带有访问拒绝处理程序标记的 Spring 安全错误
【发布时间】:2014-05-08 02:15:04
【问题描述】:

当我的应用处理 AccessDeniedException 时,我添加了 access-denied-handler 标记以重定向到特定页面,但出现错误:

配置问题:无法从相对导入 bean 定义 位置 [pgm-security-cas.xml] 违规资源:类路径 资源 [spring/pgm-servlet.xml];嵌套异常是 org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: 来自类路径资源的 XML 文档中的第 92 行 [spring/pgm-security-cas.xml] 无效;嵌套异常是 org.xml.sax.SAXParseException:cvc-complex-type.2.4.a:无效的内容 发现以元素“sec:access-denied-handler”开头。之一 '{"http://www.springframework.org/schema/security":intercept-url}' 是 预计。

这是我的 xml:

<bean id="fsi"
    class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager" />
    <property name="securityMetadataSource">
        <sec:filter-invocation-definition-source use-expressions="true">
            <sec:intercept-url pattern="/manageboxes" access="hasRole('A_READ_USER')" />
            <sec:access-denied-handler error-page="/accessDeniedPage" />
        </sec:filter-invocation-definition-source>
    </property>
</bean>

有人知道问题出在哪里吗?

filterChainProxy的定义是:

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
    <sec:filter-chain-map request-matcher="ant">
        <sec:filter-chain pattern="/xhtml/login/invalidLogin.xhtml*" filters="none" />
        <sec:filter-chain pattern="/j_spring_security_logout"
            filters="logoutFilter,fsi" />
        <sec:filter-chain pattern="/javax.faces.resource/*"
            filters="none" />
        <sec:filter-chain pattern="/**"
            filters="casAuthenticationFilter, casValidationFilter, wrappingFilter, sif, j2eePreAuthFilter, logoutFilter, fsi" />
    </sec:filter-chain-map>
</bean>

【问题讨论】:

  • &lt;access-denied-handler&gt; 只允许作为&lt;http&gt; 的直接子代。正如错误消息所述,它不是&lt;filter-invocation-definition-source&gt; 的有效子代(只有&lt;intercept-url&gt; 有效)。
  • 请显示您的filterChainProxy的定义。
  • 我已经编辑了我的问题

标签: spring spring-security access-denied


【解决方案1】:

&lt;access-denied-handler&gt; 不能放在&lt;filter-invocation-definition-source&gt; 中。你必须创建一个exceptionTranslator

<bean id="exceptionTranslator"            class="org.springframework.security.web.access.ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
    <bean class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"
            p:loginFormUrl="/login" />
</property>
<property name="accessDeniedHandler">
    <bean class="org.springframework.security.web.access.AccessDeniedHandlerImpl"
    p:errorPage="/accessDenied" />
</property>
</bean> 

并将其连接到您的filterChainProxy

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
    <sec:filter-chain-map request-matcher="ant">
        <sec:filter-chain pattern="/**"
            filters="casAuthenticationFilter, casValidationFilter, wrappingFilter, sif,      j2eePreAuthFilter, logoutFilter, 
            exceptionTranslator,
            fsi" />
        </sec:filter-chain-map>
</bean>

【讨论】:

  • 嗨,Dirk,非常感谢您的回答,但是,我不明白您编写的 exceptionTranslator 是如何工作的。就我而言,我想在我的应用中处理对 manageboxes 区域的访问。
  • 它按照您的设想工作。如果访问被拒绝,spring 会重定向到errorPage url。在我的示例中就是/accessDenied(我只是从我的生产代码中复制了它),您应该将其修改为accessDeniedPage,以使其与您的fsi-bean 对齐。
  • 即:您从 fsi-bean 中删除 &lt;sec:access-denied-handler error-page="/accessDeniedPage" /&gt;,添加 exceptionTranslator bean 定义将 exceptionTranslator 添加到您的 filterChain(我的示例中的倒数第二个条目,就在 fsi 过滤器之前)。
  • 嗨,德克,谢谢。现在我没有错误并且抛出了 AccessDeniedException 但没有处理。我已经从我的 fsi-bean 中删除了访问拒绝处理程序,我已经添加了 exceptionTranslatorFilter 定义并将其添加到我的 filterChain V_V
  • 你好,Dirk,我修好了。问题是,我会永远记住这一点,过滤器的顺序很重要。我在过滤器列表的最后添加了我的 exceptionTranslatorFilter 到 filter-chan... 所以我把它移到我的 fsi 和 tachan 后面!有用。非常感谢你帮助我的朋友!
猜你喜欢
  • 2013-10-31
  • 2011-12-26
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多