Spring 安全标签在错误页面中不起作用

Posted

技术标签:

【中文标题】Spring 安全标签在错误页面中不起作用【英文标题】:Spring security tags do not work in error pages 【发布时间】:2013-04-29 21:18:04 【问题描述】:

对于我希望处理的每个错误代码,我都有自定义错误页面,尽管我发现 spring-security 标记在使用这些页面时不起作用。例如,下面只显示“一个”:

<%@ page session="false" %>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
<p>One</p>
<sec:authorize access="isAuthenticated()">
  <p>Two</p>
</sec:authorize>
<sec:authorize access="!isAuthenticated()">
  <p>Three</p>
</sec:authorize>

具体来说,我的目标是我的web.xml 提供的错误页面,即

<error-page>
  <error-code>404</error-code>
  <location>/WEB-INF/error/404-layout.jsp</location>
</error-page>

在我的控制器中,我抛出了一个名为ResourceNotFoundExceptionRuntimeException,并用@ResponseStatus(value = HttpStatus.NOT_FOUND) 注释了找不到实体的位置。这会正确重定向到错误页面。

不起作用的正是上面所解释的,弹簧安全标签中的任何内容都不会呈现,无论是导致true 还是false,如我的示例所示,这两个标签都不会产生输出。

【问题讨论】:

【参考方案1】:

如果页面是为通过 Spring Security 过滤器链的请求而呈现的,则标签只会“工作”(您可能应该澄清“不工作”的意思)。

您在web.xml 中声明的错误页面将由容器直接处理,据我所知,没有办法告诉它对它们应用过滤器映射。

【讨论】:

正确吗?它不是已经通过链条到达控制器了吗?控制器将抛出ResourceNotFoundException。我想另一种方法是设置一个错误页面映射到静态路径的弹簧控制器。 我不确定您指的是什么控制器。你能否在你的问题中澄清你在谈论什么类型的错误页面(你的意思是那些在你的web.xml 或其他东西中使用error-page 定义的错误页面)以及实际上什么不起作用? 老实说,我不确定 servlet 规范是否为您提供了关于如何处理 error-page 页面的任何保证。它甚至可能是特定于容器的。无论如何,它们通常非常简单。您可能想通过从一个中转储堆栈来检查它包含的内容。 我已按要求进行了更新,我的示例说明了我的意思是不工作,输入的两个标签提供了尝试输出已验证和未验证块的示例,均不产生输出。 【参考方案2】:

有一个解决方案 - 请参阅答案 https://***.com/a/6199119 - 将这些附加信息添加到 web.xml 中的过滤器映射就足够了:

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

【讨论】:

以上是关于Spring 安全标签在错误页面中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

自定义登录在 Spring 中不起作用

Spring Boot DevTools 在 Eclipse 中不起作用

Spring Security with hibernate:hasRole() 在配置中不起作用

使用 # 时锚 <a> 标签在 chrome 中不起作用

Spring Security Filter 测试,身份验证在 POSTMAN 中不起作用

mmenu 菜单系统在 .Net 表单标签中不起作用