別の 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も認証したいということです。これは本当に私を怒らせています。スパゲッティコードから逃れるにはどのような解決策が良いでしょうか?