【发布时间】:2011-09-12 10:39:53
【问题描述】:
我正在尝试为 403(拒绝访问)和 500(内部服务器错误)等错误编写自定义错误页面。它们将从 Velocity 模板呈现,并使用用户的语言环境翻译所有消息。身份验证和语言环境解析在应用程序中运行良好。
我在 web.xml 中将位置设置为所需的页面,并在 webmvc-context.xml 中通过添加 requet-to-view 控制器。
我遇到的问题是 SecurityContextHolder.getContext().getAuthentication() 在错误页面视图中返回 null。查看我看到的日志:
06.10 14:42:26 DEBUG - context.HttpSessionSecurityContextRepository(HttpSessionSecurityContextRepository.java:351) - - SecurityContext stored to HttpSession: 'org.springframework.security.core.context.SecurityContextImpl@ece7b0b7: Authentication: ...
06.10 14:42:26 DEBUG - context.SecurityContextPersistenceFilter(SecurityContextPersistenceFilter.java:89) - - SecurityContextHolder now cleared, as request processing completed
06.10 14:42:26 DEBUG - servlet.DispatcherServlet(DispatcherServlet.java:691) - - DispatcherServlet with name 'foo' processing GET request for [/foo/app/error/403.html]
因此,Spring 或 Tomcat 重定向到错误页面并且请求最终完成,因此上下文被清除。并且新的“请求”没有经过 Spring Security 过滤器,因此不会恢复上下文。
通常的方法行不通,但似乎身份验证信息在会话中的某处,也是因为 AbstractTemplateView 记录以下内容:
Exposing session attribute 'SPRING_SECURITY_CONTEXT' with value [org.springframework.security.core.context.SecurityContextImpl@edfbd958: Authentication: org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken@edfbd958...
我如何正确获取,以便正常页面和错误页面的行为相同?
【问题讨论】:
标签: java spring authentication spring-security