2010-05-05 3 views
2

Я нашел несколько полезных советов о том, как написать пользовательское царство и loginModule. Мне интересно, если можно получить доступ к удаленному EJB в пользовательском модуле loginModule.Возможно получить доступ к удаленным EJB из пользовательского LoginModule?

В моем случае у меня есть удаленные EJB, которые предоставляют доступ к пользовательским объектам (через JPA) - могу ли я их использовать (например, через аннотацию @EJB)?

ответ

2

Хорошо, я нашел ответ сам: отлично работает! Я могу получить ссылку на удаленный SLSB через InitialContext.

Вот код:

public class UserLoginModule extends AppservPasswordLoginModule { 

    Logger log = Logger.getLogger(this.getClass().getName()); 

    private UserFacadeLocal userFacade; 

    public UserLoginModule() { 

     try { 
      InitialContext ic = new InitialContext(); 
      userFacade = (UserFacadeLocal) ic.lookup("java:global/MyAppServer/UserFacade!com.skalio.myapp.beans.UserFacadeLocal"); 
      log.info("userFacade bean received"); 

     } catch (NamingException ex) { 
      log.warning("Unable to get userFacade Bean!"); 
     } 
    } 

    @Override 
    protected void authenticateUser() throws LoginException { 
     log.fine("Attempting to authenticate user '"+ _username +"', '"+ _password +"'"); 

     User user; 

     // get the realm 
     UserRealm userRealm = (UserRealm) _currentRealm; 

     try { 
      user = userFacade.authenticate(_username, _password.trim()); 
      userFacade.detach(user); 

     } catch (UnauthorizedException e) { 
      log.warning("Authentication failed: "+ e.getMessage()); 
      throw new LoginException("UserLogin authentication failed!"); 

     } catch (Exception e) { 
      throw new LoginException("UserLogin failed: "+ e.getMessage()); 

     } 
     log.fine("Authentication successful for "+ user); 

     // get the groups the user is a member of 
     String[] grpList = userRealm.authorize(user); 
     if (grpList == null) { 
      throw new LoginException("User is not member of any groups"); 
     } 

     // Add the logged in user to the subject's principals. 
     // This works, but unfortunately, I can't reach the user object 
     // afterwards again. 
     Set principals = _subject.getPrincipals(); 
     principals.add(new UserPrincipalImpl(user)); 

     this.commitUserAuthentication(grpList); 
    } 

} 

Хитрость заключается в том, чтобы отделить интерфейс для бобов из WAR. Я связываю все интерфейсы и общие объекты в отдельном модуле OSGi и развертываю его с помощью asadmin --type osgi. В результате пользовательский UserLoginModule может загрузить их.

+0

Да. Я хочу видеть ваш код. Мне нужно решить эту проблему. Благодарю. – 2012-02-08 17:47:43

+0

Код добавлен. К настоящему моменту я больше не использую этот подход, хотя он работал так, как ожидалось. Однако я обнаружил, что развертывание в кластерной среде слишком сложно. Вместо этого я теперь использую простой «ResourceFilter» перед ресурсами REST, требующим аутентификации. Гораздо проще, все в одной и той же ВОЙНЕ. – Hank

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