使用Spring Security标记库时将异常映射到404页面

时间:2011-01-24 10:21:04

标签: java spring exception-handling spring-security jsp-tags

将Exception映射到404页面时,Spring Security标记无法从安全上下文中找到身份验证信息。使用“真实”404,可以找到身份验证。

我的web.xml:

<error-page>
  <exception-type>com.example.NotFoundException</exception-type>
  <location>/app/404</location>
</error-page>

<error-page>
  <error-code>404</error-code>
  <location>/app/404</location>
</error-page>

在JSP上我有:

<sec:authorize access="hasRole('ROLE_USER')">
  <%-- Show navigation links --%>
</sec:authorize>
<sec:authorize access="isAnonymous()">
  <%-- Show login form --%>
</sec:authorize>

/app/404路径映射到只返回视图的控制器。当我浏览到/foo/some_invalid_id时,NotFoundException被从控制器抛出,最后当它进入JSP时,它无法在SecurityContext中找到身份验证,也无法呈现这两个选项。相反,当我浏览/something_that_really_doesnt_exist时,它能够判断我是否登录并呈现正确的HTML。

2 个答案:

答案 0 :(得分:17)

将以下两个调度程序元素添加到spring security filter-mapping:

<filter-mapping>
    ...
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

默认情况下,只有普通请求才会通过定义的过滤器映射。

“INCLUDE”和“FORWARD”是另外两个有效的调度程序元素值。

答案 1 :(得分:0)

最可能的情况是代码中的某些组件在异常处理时调用HttpSession.invalidate()。您可以通过简单的调试轻松找到它。

但实际上没有必要检查isAnonymous() - 这足以检查用户没有 ROLE_USER权限:

  • 在Spring Security 2中:您可以使用areNotGranted标记的<sec:authorize>属性(请参阅Spring Security 2 documentation
  • 在Spring Security 3中:您可以使用Spring EL评估负面情况:access="!hasRole('ROLE_USER')"