gpt4 book ai didi

java - Spring SecurityContext 在错误页面上返回空认证

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:36 26 4
gpt4 key购买 nike

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

我在 web.xml 中将位置设置为所需的页面,并在 webmvc-context.xml 中通过添加请求查看 Controller 。

我遇到的问题是 SecurityContextHolder.getContext().getAuthentication() 在错误页面 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 过滤器,因此不会恢复上下文。

通常的方法行不通,但似乎身份验证信息在 session 中的某处,也是因为 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 session )并提供对 Authentication 的访问 通过 SecurityContextRepository 而不是 SecurityContextHolder。请记住,如果用户未登录,Authentication 仍将为 null。

关于java - Spring SecurityContext 在错误页面上返回空认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6305801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com