私はあなたが求めているのと同じものを探しました。これまでのところ、JDKでそれを行う方法を見つけていません。
Javaバグデータベースの拡張要求があります。レポートを見て、Sunからの応答があるかどうかを確認します(レポートに投票して、すぐに修正されることを願っています)。
私がやったのは、オーバーライドsun.net.www.protocol.http.NTLMAuthentication
クラスでした。を見sun.net.www.protocol.http.HttpURLAuthentication
て、変更する必要があるのは次の結果だけであることがわかりました。
NTLMAuthentication.supportsTransparentAuth()
このメソッドには、true
Windowsプラットフォームなどで、ハードコードされた戻り値がありfalse
ます。このコードは、Windows7にインストールされているJDKから抽出されています。
static boolean supportsTransparentAuth()
{
return true;
}
その方法は、Windowsクレデンシャルをデフォルトで使用する必要があるかどうかを示しています。に設定するtrue
と、カスタムオーセンティケーターコードは呼び出されません。HttpURLConnection
クラスのこのフラグメントを参照してください。
//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);
}
NTLMAuthentication
ソースコードを取得するために、このJavaデコンパイラーを使用しました。JDKインストールフォルダにあるrt.jarを開き、目的のクラスコードをコピーしました。
次に、supportsTransparentAuth
falseを返すように変更しました。ただし、このメソッドが最初にシステムプロパティをチェックし、次にそれに基づいてtrueまたはfalseを返す場合は非常に望ましいでしょう。
コンパイルするには、Javaファイルをsun / net / www / protocol / httpフォルダー構造の下に配置し、次のコマンドを実行します。
javac NTLMAuthentication.java
次に、以下を使用してアプリケーションを実行します。
java -Xbootclasspath:"path/to/your/sun/net/www/protocol/http/classes;normal/JDK/boot/directories"
これにより、JVMNTLMAuthentication
はrt.jarの実装の前に実装をロードするようになります。を使用したデフォルトのクラス読み込みパスを見逃さないように注意する必要があります。そうしないと-Xbootclasspath
、ClassNotFound
エラーが発生します。
その後、すべてが正常に機能しました。
このアプローチには、注意すべき重要な欠点があります。
- セキュリティ上のリスクがあります。だれでも別の.classファイルをブートフォルダにドロップして、ユーザーの資格情報やその他の重要な情報を盗む可能性があります。
- Sunパッケージのコードは予告なしに変更される可能性があるため、変更内容と互換性がありません。
- このコードをデプロイすると、Sunコードライセンスに違反することになります。ドキュメントから:
-Xbootclasspath:bootclasspathブートクラスファイルを検索するためのディレクトリ、JARアーカイブ、およびZIPアーカイブのセミコロン区切りのリストを指定します。これらは、Java2SDKに含まれているブートクラスファイルの代わりに使用されます。注:rt.jarのクラスをオーバーライドする目的でこのオプションを使用するアプリケーションは、Java 2 RuntimeEnvironmentのバイナリコードライセンスに違反するため、デプロイしないでください。
したがって、これは実稼働環境には絶対に適していません。
最後に、これはブートクラスパスオプションとJavaクラスローダーに関する優れた情報源です:PDF
お役に立てれば。