|
HTTP 認証 |
ドキュメントの目次 |
一般に、認証方式はすべてプロキシとサーバーの両方によって機能します。一部のもの (基本およびダイジェスト) は、プロキシとサーバーで同時に使用できます。プロキシとサーバーの認証を区別する方法については次を参照してください。
getPasswordAuthentication() メソッドをオーバーライドする必要があります。なお、このメソッドは abstract ではなく、デフォルト実装は処理を行いません。次に最も単純な例を示します。
class MyAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication () {
return new PasswordAuthentication ("user", "pass1".toCharArray());
}
}
この例では、各 HTTP 認証の相互作用に使用するユーザー名「user」とパスワード「pass1」を返します。さらに実践的な例では、java.net.Authenticator の別のメソッドを使用して認証を必要とする HTTP 要求について詳細情報を取得します。資格の要求をそれぞれ処理する方法について決定するには、getPasswordAuthentication() を実装して、次のメソッドのいずれかを呼び出します。
Authenticator.setDefault (authinstance);
ここで authinstance は、すでに宣言済みの実装クラスのインスタンスです。これが呼び出されない場合、認証は無効になり、サーバー認証エラーが IOException オブジェクト経由でユーザーコードに返されます。HTTP 実装は、インストールされると、可能な場合に、キャッシュされた資格経由またはシステムから取得可能な資格経由で自動認証を試行します。正しい資格が使用できない場合は、ユーザーの Authenticator を呼び出して、この資格を取得できます。
特定の方式を必ず使用する必要がある場合は、次のシステムプロパティーを設定してデフォルト時の動作を修正できます。
-Dhttp.auth.preference="scheme"
コマンド行でこのプロパティーの設定を行う場合は、-D を指定します。「http.auth.preference」はプロパティー名であり、「scheme」は使用する方式名です。提案した方式のリストにサーバーがこの方式を含めない場合は、デフォルト設定が有効となります。
getRequestingPrompt() メソッドは、サーバーが提供するような基本認証レルムを返します。
-Dhttp.auth.digest.validateServer="true" -Dhttp.auth.digest.validateProxy="true"
getRequestingPrompt() メソッドは、サーバーが提供するようなダイジェスト認証レルムを返します。
Microsoft Windows プラットフォームでは、NTLM 認証により、ユーザーの Authenticator オブジェクトを要求せずにシステムからユーザー資格の取得を試みます。このような資格をサーバーが受け入れない場合は、ユーザーの Authenticator が呼び出されます。
NTLM をサポートする以前に Authenticator クラスが定義されているため、NTLM ドメインフィールドの API をさらにサポートすることはできません。ドメインを指定する方法には、次の 3 つの方法があります。
java.security.krb5.conf で達成されます。例を示します。
java -Djava.security.krb5.conf=krb5.conf \
-Djavax.security.auth.useSubjectCredsOnly=false \
ClassName
com.sun.security.jgss.krb5.initiate という名前の標準 JDK 6 GSS_INITIATE_ENTRY エントリの検索を行います。
spnegoLogin.conf ファイルを指定できます。
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule
required useTicketCache=true;
};
また、次のようにして Java を実行します。
java -Djava.security.krb5.conf=krb5.conf \
-Djava.security.auth.login.config=spnegoLogin.conf \
-Djavax.security.auth.useSubjectCredsOnly=false \
ClassName
java.net.Authenticator を提供して、ユーザー名とパスワードを必要とする場合 (つまり、利用可能な資格キャッシュが存在しない場合) はそれらを HTTP SPNEGO モジュールに送ることができます。使用中の Authenticator でチェックが必要な唯一の認証情報は、getRequestingScheme() を使用して取得できる方式です。値は「Negotiate」とする必要があります。
これは、使用中の Authenticator 実装が次のようになることを意味します。
class MyAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication () {
if (getRequestingScheme().equalsIgnoreCase("negotiate")) {
String krb5user;
char[] krb5pass;
// get krb5user and krb5pass in your own way
....
return (new PasswordAuthentication (krb6user,
krb5pass));
} else {
....
}
}
}
注意: java.net.Authenticator の仕様に応じてユーザー名とパスワードを同時に取得するようになっているため、JAAS 構成ファイルで principal=xxx の指定は行わないでください。
http.auth.preference を提供して、一部の方式がサーバーから要求される間は常にその方式が使用されるようにします。このシステムプロパティーには、「SPNEGO」または「Kerberos」のいずれかを使用できます。「SPNEGO」は、GSS/SPNEGO 機構を使用してネゴシエーション方式に応答する場合、「Kerberos」は、GSS/Kerberos 機構を使用してネゴシエーション方式に応答する場合に選択します。通常、Microsoft 製品の認証には、「SPNEGO」を使用します。値「Kerberos」は、Microsoft サーバーにも対応しています。これは、ネゴシエーションは認識するが SPNEGO については対応していないサーバーに遭遇する場合にのみ必要となります。
http.auth.preference を設定していない場合は、内部の順番が次のようになります。
http.auth.preference が SPNEGO または Kerberos に設定されている場合は、失敗しても、単にネゴシエーション方式を試行することが要求されていると想定されます。他のいかなる方式に対しても切り替えを行わず、HTTP 応答から 401 または 407 のエラーを受け取ることを表す IOException がスローされます。
/********* RunHttpSpnego.java ***********/
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
public class RunHttpSpnego {
static final String kuser = "dummy"; // your account name
static final String kpass = "bogus"; // your password for the account
static class MyAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
// I haven't checked getRequestingScheme() here, since for NTLM
// and Negotiate, the usrname and password are all the same.
System.err.println("Feeding username and password for " + getRequestingScheme());
return (new PasswordAuthentication(kuser, kpass.toCharArray()));
}
}
public static void main(String[] args) throws Exception {
Authenticator.setDefault(new MyAuthenticator());
URL url = new URL(args[0]);
InputStream ins = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
String str;
while((str = reader.readLine()) != null)
System.out.println(str);
}
}
/********* krb5.conf ***********/
[libdefaults]
default_realm = AD.LOCAL
[realms]
AD.LOCAL = {
kdc = kdc.ad.local
}
/********* login.conf ***********/
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=false useTicketCache=true;
};
ここで RunHttpSpnego.java をコンパイルして次を実行します。
java -Djava.security.krb5.conf=krb5.conf \
-Djava.security.auth.login.config=login.conf \
-Djavax.security.auth.useSubjectCredsOnly=false \
RunHttpSpnego \
http://www.ad.local/hello/hello.html
次のように出力されます。
Feeding username and password for Negotiate <h1>Hello, You got me!</h1>事実、ドメインユーザーとして Windows マシンを稼働しているか、またはすでに
kinit コマンドを発行して資格キャッシュを取得した Linux または Solaris マシンを稼働しています。MyAuthenticator クラスは完全に無視され、次のようにシンプルに出力されます。
<h1>Hello, You got me!</h1>ユーザー名とパスワードが参照されないことを示しています。これは、いわゆるシングルサインオンです。 また、次のように実行して、
java RunHttpSpnego \
http://www.ad.local/hello/hello.html
代替がどのように実行されるかを確認できます。この場合は、次のように表示されます。
Feeding username and password for ntlm <h1>Hello, You got me!</h1>
|
Copyright © 2006 Sun Microsystems, Inc.All Rights Reserved. |
Java Software |