Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Chrome中X509证书的无限身份验证_Java_Google Chrome_Authentication_Spring Security - Fatal编程技术网

Java Chrome中X509证书的无限身份验证

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

我在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);
}
在第一次身份验证尝试期间
!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请求(包括请求头)的例子吗?