我们有一个实用类中的静态方法,可以从URL下载文件。如果需要用户名和密码,已经设置了身份验证器,可以检索凭据。问题是,只要凭证有效,第一次成功连接的凭证就会用于之后的每个连接。这是一个问题,因为我们的代码是多用户的,由于不会为每个连接检查凭据,所以可能会出现没有适当凭据的用户下载文件的情况。
以下是我们正在使用的代码。
我只在第一次下载文件时看到了从getPasswordAuthentication中的日志声明。之后,即使凭据已重置,也不再调用getPasswordAuthentication。结果是,在第一次成功连接后,可以输入无效凭据,并且仍然可以成功连接。这可能是由于下载方法是静态的,并且位于静态类中的结果吗? 编辑 我忘记提到这是在Tomcat下运行的JSF Web应用程序 - 也许其中一种技术在某个地方设置了一些默认凭据?
我将URLAuthenticator分离成自己的类,并尽可能地使其非静态,但问题仍然存在。我读到过,如果使用Authenticator.setDefault(null)将默认验证器设置为null,则在Windows上将使用NTLM身份验证。这里不应该是问题,因为我每次都设置Authenticator,但我想提出来。明确使用了NTLM身份验证,因为如果服务器以具有对下载文件的访问权限的用户身份运行,则甚至不会要求凭据,文件只需下载即可。因此,显然有些东西正在获取我的凭据并在调用验证器之前传递它们。
以下是我们正在使用的代码。
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 Web应用程序 - 也许其中一种技术在某个地方设置了一些默认凭据?
我将URLAuthenticator分离成自己的类,并尽可能地使其非静态,但问题仍然存在。我读到过,如果使用Authenticator.setDefault(null)将默认验证器设置为null,则在Windows上将使用NTLM身份验证。这里不应该是问题,因为我每次都设置Authenticator,但我想提出来。明确使用了NTLM身份验证,因为如果服务器以具有对下载文件的访问权限的用户身份运行,则甚至不会要求凭据,文件只需下载即可。因此,显然有些东西正在获取我的凭据并在调用验证器之前传递它们。