java - Chrome 中 X509 证书的无限身份验证
问题描述
我已经在 Java 中实现了 X509 证书身份验证机制
它工作正常,但有一个例外 - 当我尝试在 Chrome 中进行身份验证时,应用程序会无限期地对用户进行身份验证。
但是,当我尝试在 Chrome 的隐身模式或 Mozilla FF 中进行身份验证时,一切正常。
问题代码如下:
public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
if (!requiresAuthentication(request, response))
{
chain.doFilter(req, res);
return;
}
try
{
Authentication authResult = attemptAuthentication(request, response);
if (authResult == null)
{
chain.doFilter(request, response);
return;
}
utils.addCORSHeaders(request, response);
sessionStrategy.onAuthentication(authResult, request, response);
securityUtils.setAuthentication(authResult);
getSuccessHandler().onAuthenticationSuccess(request, response, authResult);
chain.doFilter(request, response);
}
catch (AuthenticationException exception)
{
unsuccessfulAuthentication(request, response, chain, exception);
}
}
protected boolean requiresAuthentication(@NotNull final HttpServletRequest request,
final HttpServletResponse response)
{
return configProperties.isEnabled() &&
!securityUtils.isAuthenticated() &&
utils.isRequestContainsCertificate(request) &&
!(sessionStrategy instanceof NullAuthenticatedSessionStrategy) &&
!request.getServletPath().contains("login") &&
!X509AuthUtils.isRequestContainsCookie(request);
}
在第一次身份验证尝试期间!requiresAuthentication
返回 false(我们尝试对用户进行身份验证)。
在下一次doFilter
调用期间!requiresAuthentication
始终返回 true(我们不对用户进行身份验证)
这是正确的,但仅适用于 Mozilla FF 和 Chrome 隐身模式。
在下一次doFilter
调用期间的常规 Chrome 中!requiresAuthentication
返回 false 并且该过程无限期运行
我调试了代码,发现
!securityUtils.isAuthenticated()
返回无效值
该方法如下所示:
public boolean isAuthenticated()
{
final Authentication existingAuth = getAuthentication();
return existingAuth != null && existingAuth.isAuthenticated() &&
!(existingAuth instanceof AnonymousAuthenticationToken);
}
public Authentication getAuthentication()
{
return SecurityContextHolder.getContext().getAuthentication();
}
由于某种原因,spring 在getAuthentication()
方法中返回 null 而它不应该返回。
正如我之前所说,该问题只能在常规 Chrome 中重现,而不能在隐身模式或 Mozilla FF 中重现。
也许我可以进行不同的调试?为什么它发生在 Chrome 而不是 Mozilla FF?
解决方案
推荐阅读
- powerbi - 检索与 Power BI 中特定状态相关的最后一条消息
- java - java - 如何在java maven项目中修复“没有GET映射”以显示自定义错误页面?
- css - 更改按钮文本颜色
- mysql - mysqlimport命令的跟踪过程
- android - 构建android Rom时空间不足
- php - Laravel 中的复合外键
- spring-boot - 来自 PODS 的内存泄漏
- java - 返回两个结果。一些应用程序版本打印“'”,另一个应用程序版本打印'。为什么?
- .net - HangFire 上重复作业的默认时区
- java - 如何使用 JdbcTemplate 将结果作为数组获取?