gpt4 book ai didi

java - 重置身份 validator 凭据

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

我们在实用程序类中有一个静态方法,可以从 URL 下载文件。已设置 validator ,以便在需要用户名和密码时可以检索凭据。问题在于,只要凭据有效,第一次成功连接的凭据就会用于之后的每个连接。这是一个问题,因为我们的代码是多用户的,并且由于不会为每个连接检查凭据,因此没有适当凭据的用户可能会下载文件。

这是我们正在使用的代码

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。结果是第一次连接成功后,可以输入无效的凭据,仍然可以连接成功。这可能是下载方法是静态的,并且在静态类中的结果吗?

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

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

最佳答案

至少我已经想通了一些事情。看来此行为是 bug .解决方法是使用 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 身份验证有效,身份 validator 仍然不会被调用,但只要服务器在没有请求文件权限的用户下运行,这应该会清除缓存出。

关于java - 重置身份 validator 凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/480895/

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