1

別の EJB サーバーからリモート EJB を呼び出したいと考えています。リモート EJB を OpenEJB にデプロイしたので、Glassfish から呼び出しますHTTPServlet。ローカル EJB で @EJB アノテーションを実行できることはわかっていますが、ユーザーに Glassfish サーブレットからリモート OpenEJB サーバーを「認証」してもらいたいと考えています。

OpenEJB の場合:

//OpenEJB server at 192.168.10.12
public class AdminManager {
    @RolesAllowed("admin")
    public void test() {
        System.out.println("Admin called this method");
    }
}

グラスフィッシュサーブレット

//Glassfish servlet at 192.168.10.10
public class AdminManage extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Properties p = new Properties();
            p.put("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory");
            p.put("java.naming.provider.url", "ejbd://192.168.10.12:4201");
            // user and pass optional

      String userName = req.getSession().getAttribute("username");
      String password = req.getSession().getAttribute("password");
            p.put("java.naming.security.principal", userName );
            p.put("java.naming.security.credentials", "password );

            final InitialContext ctx = new InitialContext(p);

            final AdminManagerRemote myBean = (MyBean) ctx.lookup("AdminManagerRemote");
            try {
                myBean.test();
            } catch(Exception epx) {
                resp.sendRedirect(resp.encodeRedirectURL("/login"));
            }
    }
}

これは解決策のようですが、これは私にとって「良い」解決策ではありません。このように、毎回 openejb への認証は最悪です。

  String userName = req.getSession().getAttribute("username");
  String password = req.getSession().getAttribute("password");
  p.put("java.naming.security.principal", userName );
  p.put("java.naming.security.credentials", "password );

そして、コードはきれいではありません。ユーザーに一度だけ認証して ejb メソッドを呼び出してもらいたい。これよりも良い解決策はありますか?

Glassfish HTTP 認証とリモート openEJB 認証を組み合わせることはできますか? ユーザーがGlassfish HTTPサーバーに認証するとき、openEJBも認証したいということです。これは本当に私を怒らせています。スパゲッティコードから逃れるにはどのような解決策が良いでしょうか?

4

3 に答える 3

0

Service Locator パターンを導入して、コードの冗長性を排除し、初期コンテキストの作成、JNDI ルックアップなどの基礎となる詳細と複雑さを隠すことができます。

リモート ホーム インターフェイスをキャッシュEJBHomeして、後で必要に応じて再利用できます。

詳細については、 Core J2EE Patterns - Service Locatorのドキュメントを参照してください。

于 2013-06-03T09:02:45.210 に答える
0

2 つのアイデア:

  1. ユーザーが Glassfish にログインするときに OpenEJB に対して認証し、EJB スタブをユーザー セッションに保存して、後で再利用します。スタブ(いわゆるハンドル)のシリアル化を機能させるには、EJB 2.x インターフェースを実装する必要があるのではないかと心配しています。

  2. EJB スタブを格納するキャッシュを実装します。指定されたユーザー名/パスワードのスタブがキャッシュにある場合は再利用し、そうでない場合は認証します。キャッシュは静的オブジェクトです。たとえば、Guava のCacheBuilderで作成できます。これは仕様に違反します (サーブレット間で情報を共有するために static を使用するべきではありません) が、これはキャッシュであるため、大した問題ではありません。クラスターでも機能します。

于 2013-06-03T06:28:33.097 に答える
0

ケルベロスは?ケルベロスソリューションを知っている人はいますか?TGS を使用してすべてのリモート サーバーにログインします。

しかし、インターネット上にはそのサンプルはありません。そして、openldap で kerberos をインストールするのは非常に困難です。

于 2013-06-12T06:16:50.120 に答える