Spring SecurityContext在错误页面上返回空身份验证

我正在尝试为403(访问被拒绝)和500(内部服务器错误)之类的错误编写一个自定义错误页面。它们将从Velocity模板呈现,并使用用户的语言环境翻译所有消息。身份验证和区域设置解析在应用程序中运行良好。

我将web.xml中的位置设置为所需的页面,并在webmvc-context.xml中通过添加了Requet-to-view控制器。

我遇到的问题是

在错误页面视图中返回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,都将重定向到错误页面,请求gest最终确定,从而清除了上下文。并且新的“请求”没有经过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...

我如何正确获取正常页面和错误页面的行为?

回答:

您遇到的问题是,ExceptionTranslationFilter哪个将异常转换为错误页面,而SecurityContextPersistenceFilter后者将身份验证从中提取出来SecurityContextRepository并将其放入中SecurityContextHolder。请求完成后,SecurityContextPersistenceFilter会将信息从中取出SecurityContextHolder

清除的原因SecurityContextHolder是,SecurityContextHolder通常是本地线程,如果servlet容器要重用线程(大多数这样做),它们可能会不小心将这些凭据提供给其他人。

通常,ExceptionTranslationFilter过滤器是最外面的过滤器,以避免发生任何异常无法转换的风险。

最好的选择是编写一个ExceptionTranslationFilter接受SecurityContextRepository(通常是您提到的HTTP会话)并Authentication通过SecurityContextRepository和而不是通过提供访问的自定义SecurityContextHolder。请记住,Authentication如果用户未登录,则仍然为null。

以上是 Spring SecurityContext在错误页面上返回空身份验证 的全部内容, 来源链接: utcz.com/qa/398424.html

回到顶部