将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。
答案 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
权限:
areNotGranted
标记的<sec:authorize>
属性(请参阅Spring Security 2 documentation access="!hasRole('ROLE_USER')"