基本的に (私の知る限り)、EJB 3.1 のクライアント アプリのセキュリティは 2.x のものと同じなので、例を見つける必要があります。
設定する必要があるもの:
- サーバー側の jaas ログイン モジュール (Web アプリケーションで見たように)
- 認証の処理方法を決定するクライアント プロパティ ファイル
- クライアント側の認証プロセスに資格情報を提供するクライアント側のコールバック
- クラスパス上のプロパティ ファイルでクライアントを起動します
これは jboss-as の例ですが、アイデアは一般的であるため、他のサーバーに変換できると思います。
# file auth.conf on the client
adb {
// jBoss LoginModule
org.jboss.security.ClientLoginModule required
;
};
これは基本的に、ログイン コンテキストadb
の場合、クライアント ログイン モジュールが成功する必要があることを示しています。このコンテキストadb
は、サーバー側のそれぞれのアプリケーション jaas コンテキストにリンクされています。
コードでは、次のようにログインを設定します。
CallbackHandler cbh =
new LoginCallbackHandler(user,pass.toCharArray());
try {
LoginContext lc = new LoginContext("adb",cbh);
lc.login(); // <--- triggers the show in the client
}
catch (LoginException e) {
System.err.println("Login failed: "+e.getMessage());
}
LoginContext では、adb
上記の auth.conf ファイルからコンテキストを指定します。
は次のLoginCallbackHandler
ようになります。
package de.bsd.adb.client;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
public class LoginCallbackHandler implements CallbackHandler {
private String user;
private char[] pass;
// Konstruktor
LoginCallbackHandler(String username,char[] password) {
user=username;
pass=password;
}
// handle() does the real work and is invoked from the client container
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException
{
// Iterate over the call backs
for (int i =0 ; i< callbacks.length; i++)
{
// NameCallback -> pass Login-Name
if (callbacks[i] instanceof NameCallback)
{
System.out.println("NameCallback");
NameCallback nc = (NameCallback)callbacks[i];
nc.setName(user);
}
// PasswordCallback -> pass Password
else if (callbacks[i] instanceof PasswordCallback)
{
System.out.println("PasswordCallback");
PasswordCallback pc =
(PasswordCallback)callbacks[i];
pc.setPassword(pass);
}
else { // unknown callback
throw new UnsupportedCallbackException(callbacks[i],"Ouch");
}}}
これで、クライアントプログラムを開始できます
java -Djava.security.auth.login.config=/path/to/auth.conf -cp bla my.Main