2013-05-31 3 views
1

Я хочу позвонить удаленному EJB с другого сервера EJB. У меня есть Remote EJB, развернутый на OpenEJB, тогда я назову их из Glassfish HTTPServlet. Я знаю, что на локальном EJB я могу сделать аннотацию @EJB, но я хочу, чтобы пользователь «аутентифицировал» удаленный сервер OpenEJB из сервлета Glassfish.Удаленный EJB от HttpServlet

на 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

//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-методы. Есть ли лучшее решение, то это?

Могу ли я объединить HTTP-аутентификацию Glassfish с удаленной аутентификацией OpenEJB? Я имею в виду, когда пользователь аутентифицируется на HTTP-сервере Glassfish, я также хочу, чтобы openEJB аутентифицировался. Это действительно заставляет меня сходить с ума. какое решение хорошо спасать от кодов спагетти?

ответ

0

Две идеи:

  1. Аутентифицировать в OpenEJB, когда пользователь входит в Glassfish, хранят EJB окурок в пользовательской сессии и повторно использовать его позже. Я опасаюсь, что вам нужно будет внедрить некоторую EJB 2.x inteface для serialization of the stub (так называемая ручка).

  2. Реализовать кеш, в котором хранятся заглушки EJB. Если заглушка для данного имени пользователя/пароля находится в кеше, повторно используйте его, если нет, аутентифицируйте. Кэш - это статический объект, его можно создать, например, с помощью Guava CacheBuilder. Это нарушает спецификацию (вы не должны использовать static для обмена информацией между сервлетами), но поскольку это кеш, это не имеет большого значения. Он даже работал бы в кластере.

0

Вы можете попробовать введение Service Locator Pattern для устранения избыточности в коде & скрыть основные детали & сложность создания исходного контекста, JNDI поиск и т.д.

Вы можете кэшировать удаленный домашний интерфейс EJBHome & затем повторно использовать его позже, когда это необходимо.

Для получения дополнительной информации можно обратиться к документации Core J2EE Patterns - Service Locator.

0

Что относительно Kerberos? Кто-то знает решение kerberos? Вход на все удаленные серверы с TGS.

Но нет образца для этого в Интернете. И его так злобно сложно установить кеберо с открытым пальцем.

Смежные вопросы