2

EJB 3.1 アプリケーションと、このアプリケーションに接続する Java クライアントがあります。ユーザー認証を作成する必要があります。

例:

class LoginBean{

public remoteLogin(String login, String password){
  // create user context with user ID
}
}

class BeanAbc{
  public remoteSecureMethod(){
      // get user context - if no context throw error
      // get user ID/login from user context and do some additional logic..
  }
}

ユーザー資格情報は DB に保存されます。Glassfishサーバーを使用しています。ユーザーコンテキストを保存する方法は? 最善の解決策は何ですか?単純なフレームワークはありますか?

4

3 に答える 3

2

基本的に (私の知る限り)、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
于 2012-10-22T19:57:22.470 に答える
1

JavaEEアプリのデファクトスタンダードのセキュリティフレームワークであるSpringSecurity必ず確認してください。最初はフレームワークのごく一部しか使用していなくても、正しい方向に進み、必要に応じて進化させることができます(認証方法を切り替えたり、承認を管理したりする場合など)。

于 2012-10-21T07:14:20.327 に答える
0

@Heiko Rupp から提供された回答を追加したいと思います - 彼が提供したコードは、スタンドアロン アプリケーションとしてうまく機能します。アプリケーション サーバーを使用している場合は、アプリケーション サーバー構成を使用して JAAS モジュールを構成する方法を確認する必要があります。
たとえば、oVirtオープン ソース プロジェクトでは、Kerberos ログイン モジュールを使用しています。
現在、JBoss AS 7
を使用しています。security-domains セクションで security-domain を定義して、standalone.xml 設定ファイルを設定しました -

 <security-domain name="EngineKerberosAuth">
                    <authentication>
                        <login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required"/>
                    </authentication>
                </security-domain>
于 2012-10-24T18:21:38.007 に答える