isAnonymous()和isAuthenticated()都在错误页面上返回false

时间:2012-08-17 04:11:19

标签: java spring jsp spring-security

我有一个错误页面,在返回404响应状态时显示。 这个页面是由模板机制生成的(我使用了tile);在这个模板中,我有一个包含类似内容的标题:

    <sec:authorize access="isAnonymous()">
        blabla
    </sec:authorize>
    <sec:authorize access="isAuthenticated()">
        blibli
    </sec:authorize>

因此,根据用户是否经过身份验证,它会显示blibli或blabla。此代码适用于使用此模板的所有页面,但我的404页面除外!它什么都没显示!

任何想法??

3 个答案:

答案 0 :(得分:10)

我敢打赌,问题在于如何在filter-mapping中定义web.xml。最常见的配置是:

<filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

这会将过滤器映射到所有网址,但仅限于通过REQUEST方法访问的网址。此过滤器未捕获所有其他情况(如INCLUDEFORWARDERROR)。因此,要将过滤器绑定到ERROR个请求,请将其定义为

<filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>

        <!-- apply Spring Security authentication to error-pages -->
        <dispatcher>ERROR</dispatcher>
</filter-mapping>

试试吧。如果不起作用则添加<dispatcher>INCLUDE</dispatcher>因为Tiles,可能包括这样的页面。

另见:

答案 1 :(得分:1)

对于那些寻找java配置的人:

private void registerSpringSecurityFilterChain(ServletContext servletContext) {
  FilterRegistration.Dynamic springSecurityFilterChain = servletContext.addFilter(
        BeanIds.SPRING_SECURITY_FILTER_CHAIN, new DelegatingFilterProxy());
  springSecurityFilterChain.addMappingForUrlPatterns(null, false, "/*");
  springSecurityFilterChain.addMappingForUrlPatterns(EnumSet.of(DispatcherType.ERROR), false, "/*");

}

答案 2 :(得分:0)

如果此404页面不在您的安全URL中,那么isAnonymous()和isAuthenticated()将返回false并且不会呈现任何内容。