He buscado lo mismo que está preguntando. Hasta el momento, no he encontrado una manera en el JDK para hacer eso.
Hay una solicitud de mejora en la base de datos de errores de Java. Eche un vistazo al report para averiguar si Sun recibe una respuesta (vote el informe para que eso se resuelva pronto).
Lo que terminé haciendo, fue anular sun.net.www.protocol.http.NTLMAuthentication
clase. Al observar sun.net.www.protocol.http.HttpURLAuthentication
, descubrí que la única cosa que hay que modificar es el resultado de:
NTLMAuthentication.supportsTransparentAuth()
Ese método tiene un valor de retorno codificada, true
en plataformas Windows y false
lo contrario. Este código se extrae de un JDK instalado en Windows 7:
static boolean supportsTransparentAuth()
{
return true;
}
Qué dice ese método es que si las credenciales de Windows debe ser utilizado por defecto. Si se establece en true
, , su código personalizado de Autenticador no se llamará. Ver este fragmento de HttpURLConnection
clase:
//Declared as a member variable of HttpURLConnection
private boolean tryTransparentNTLMServer = NTLMAuthentication.supportsTransparentAuth();
//Inside of getServerAuthentication method.
PasswordAuthentication a = null;
if (!tryTransparentNTLMServer) {
//If set to false, this will call Authenticator.requestPasswordAuthentication().
a = privilegedRequestPasswordAuthentication(url.getHost(), addr, port, url.getProtocol(), "", scheme, url, RequestorType.SERVER);
}
/* If we are not trying transparent authentication then
* we need to have a PasswordAuthentication instance. For
* transparent authentication (Windows only) the username
* and password will be picked up from the current logged
* on users credentials.
*/
if (tryTransparentNTLMServer || (!tryTransparentNTLMServer && a != null)) {
//If set to true or if Authenticator did not return any credentials, use Windows credentials.
//NTLMAuthentication constructor, if receives a == null will fetch current looged user credentials.
ret = new NTLMAuthentication(false, url1, a);
}
Para obtener NTLMAuthentication
código fuente, solía this Java decompiler. Abrió rt.jar ubicado en la carpeta de instalación de JDK y copió el código de clase deseado.
Entonces, simplemente cambié supportsTransparentAuth
para devolver falso. Sin embargo, sería muy conveniente si este método verifica primero una propiedad del sistema y luego devuelve verdadero o falso en función de eso.
Para compilar, me acaba de colocar el archivo Java bajo http estructura de sol/net/www/protocolo/carpeta y ejecutar:
javac NTLMAuthentication.java
A continuación, ejecute mi solicitud usando:
java -Xbootclasspath:"path/to/your/sun/net/www/protocol/http/classes;normal/JDK/boot/directories"
Eso le indicará a la JVM que cargue nuestra implementación de NTLMAuthentication
antes que la de rt.jar. Debe tener cuidado de no perder ninguna ruta de carga de clase predeterminada con -Xbootclasspath
, o habrá ClassNotFound
errores.
Después de eso, todo funcionó bien.
Este enfoque tiene importantes inconvenientes que debe tener en cuenta.
- Existen riesgos de seguridad. Cualquiera puede colocar un archivo .class diferente en la carpeta de inicio y robar las credenciales del usuario u otra información importante.
- El código de los paquetes de Sun puede cambiar sin previo aviso y, por lo tanto, será incompatible con sus cambios.
- Si implementa este código, estará contraviniendo la licencia de Sun. Desde el documentation:
-Xbootclasspath: bootclasspath Especifica una lista separada por comas de los directorios, archivos JAR, y ZIP para buscar la clase de arranque archivos. Estos se utilizan en lugar de los archivos de clase de arranque incluidos en el SDK Java 2 . Nota: Las aplicaciones que usan esta opción para el propósito de anulando una clase en rt.jar no deberían implementarse porque al hacerlo, contravendría la licencia de código binario de Java 2 Runtime Environment.
Por lo tanto, esto definitivamente no es adecuado para entornos de producción.
Por último, esta es una excelente fuente sobre la opción de ruta de clases de arranque y cargadores de clases Java: PDF
Espero que esto ayude.
Puede encontrar el código que valida si usa Credenciales de Windows en la clase 'sun.net.www.protocol.http.HttpURLConnection'. Eche un vistazo a la creación de instancias de 'NTLMAuthentication' y la bandera 'tryTransparentNTLMServer'.Estoy buscando hacer lo mismo que tú, pero tampoco estoy seguro de cómo hacer eso. – jmend