Java Chrome中X509证书的无限身份验证
我在Java中实现了一种X509证书身份验证机制 它工作正常,但有一个例外——当我尝试在Chrome中进行身份验证时,应用程序会无限期地对用户进行身份验证 然而,当我尝试在Chrome的匿名模式或Mozilla FF中进行身份验证时,一切正常 问题代码如下:Java Chrome中X509证书的无限身份验证,java,google-chrome,authentication,spring-security,Java,Google Chrome,Authentication,Spring Security,我在Java中实现了一种X509证书身份验证机制 它工作正常,但有一个例外——当我尝试在Chrome中进行身份验证时,应用程序会无限期地对用户进行身份验证 然而,当我尝试在Chrome的匿名模式或Mozilla FF中进行身份验证时,一切正常 问题代码如下: public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws I
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);
}
在第一次身份验证尝试期间!requireAuthentication
返回false(我们尝试对用户进行身份验证)
在下一次doFilter
调用期间!requireAuthentication
始终返回true(我们不验证用户)
这是正确的,但仅适用于Mozilla FF和Chrome匿名模式
在下一次doFilter
调用期间,使用常规Chrome!requireAuthentication
返回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,而它不应该返回null
正如我前面所说的,这个问题只能在普通的Chrome中重现,而不能在匿名模式或Mozilla FF中重现
也许我可以用不同的方式调试?
为什么它发生在Chrome中而不是Mozilla FF中?你能分享一个HTTP请求(包括请求头)的例子吗?