当前位置: 首页 > 面试题库 >

重置身份验证器凭据

马凡
2023-03-14
问题内容

实用程序类中有一个静态方法,该方法将从URL下载文件。已经设置了身份验证器,以便如果需要用户名和密码,则可以检索凭据。问题是,只要凭据有效,来自第一个成功连接的凭据将用于每个连接后缀。这是一个问题,因为我们的代码是多用户的,并且由于没有为每个连接检查凭据,所以没有适当凭据的用户可能会下载文件。

这是我们正在使用的代码

private static URLAuthenticator auth;

public static File download(String url, String username, String password, File newFile)
{
    auth.set(username, password);
    Authenticator.setDefault(auth);
    URL fURL = new URL(url);
    OutputStream out = new BufferedOutputStream(new FileOutputStream(newFile));
    URLConnection conn = fURL.openConnection();
    InputStream in = conn.getInputStream();

    try
    {
        copyStream(in, out);
    }
    finally
    {
        if (in != null)
            in.close();
        if (out != null)
            out.close();
    }

    return newFile;
}

public class URLAuthenticator extends Authenticator
{
    private String username;
    private String password;

    public URLAuthenticator(String username, String password)
    {
         set(username, password);
    }

    public void set(String username, String password)
    {
        this.username = username;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication()
    {
        log.debug("Retrieving credentials '" + username + "', '" + password + "'.");
        return new PasswordAuthentication(username, password.toCharArray());
    }
}

第一次下载文件时,我只从getPasswordAuthentication中看到一次日志语句。在第一次成功尝试之后,即使已重置凭据,也不会再次调用getPasswordAuthentication。结果是,在第一次成功连接后,可以输入无效的凭据,并且仍然可以建立成功的连接。这可能是因为download方法是静态的,并且是在静态类中的结果吗?

编辑 我忘了提到这是在tomcat下运行的JSF Web应用程序中的-也许其中一项技术是在某处设置一些默认凭据?

我已经将URLAuthenticator放入其自己的类中,并使其尽可能地是非静态的,但是问题仍然存在。我已经读过,如果将Authenticator.setDefault(null)的默认身份验证器设置为null,则在Windows上将使用NTLM身份验证。因为我每次都设置Authenticator,但这不是问题,但我想我应该把它丢在那里。肯定会使用NTLM身份验证,因为如果服务器以可以访问下载文件的用户身份运行,则甚至不需要输入凭据,文件就可以下载。所以很明显,是在我的凭据被获取并在身份验证器被调用之前传递给了我。


问题答案:

我至少知道了一些东西。看来,这种行为是一个错误。一种解决方法是使用特定于Sun的类来显式重置缓存,如下所示:

import sun.net.www.protocol.http.AuthCacheValue;
import sun.net.www.protocol.http.AuthCacheImpl;
....
AuthCacheValue.setAuthCache(new AuthCacheImpl());
Authenticator.setDefault(new URLAuthenticator(username, password));

我正在问题中描述的下载功能顶部重置AuthCache。在编译期间,您会收到有关使用这些类的警告。这不能完全解决问题:如果NTLM身份验证有效,则仍然不会调用身份验证器,但是只要服务器在没有所请求文件权限的用户下运行,就应该清除缓存出来。



 类似资料:
  • 我对社交网络分析和twitter api是新手。我想收集关于特定主题的tweets。所以我写了下面的代码 在我的程序中,我需要在哪里提供凭据 谢谢

  • 问题内容: 我正在尝试使用kerberos / HTTP主机进行身份验证。使用Apache HttpClient作为我的客户端- 以及此源的略微修改版本。 我的Kerberos身份验证非常顺利,我希望知道如何以编程方式设置登录凭据。目前,凭据是通过控制台手动输入的,但是我想在运行时选择它。[实际上,正如我希望对大量用户进行自动化和负载测试的服务器。]。 编辑:这是相关部分的代码片段: 该接口有两种

  • 我试图在一个反应式Spring Boot应用程序中配置一个Spring Security性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建用户名密码身份验证令牌(身份验证),并手动进行身份验证。 但是,在执行此操作时,应用程序似乎无

  • 我在Spring Boot web应用程序中有一个非常特殊的要求:我有内部和外部用户。内部用户通过使用KeyCoap身份验证登录到web应用程序(他们可以在web应用程序中工作),但我们的外部用户通过简单的Spring Boot身份验证登录(他们可以做的只是下载web应用程序生成的一些文件) 我想做的是使用多个身份验证模型:除了/download/*之外的所有路径都要通过我们的keyCoap身份验

  • 我正在laravel中创建一个多身份验证系统,其中有两种类型的用户:管理员(由我创建)和用户(使用本地laravel身份验证系统)。 如果我以用户身份登录,当我尝试访问登录页面时,当我已经登录,它会将我重定向回仪表板,但如果我以管理员身份登录,当我再次访问管理员登录页面时,它会让我再次登录,尽管已经作为管理员登录。 以下是我的重定向身份验证类代码: 有人能解释一下发生了什么事吗?