Можно ли получить доступ к удаленным EJB из пользовательского модуля LoginModule?

Я нашел несколько хороших советов о том, как написать пользовательскую область и loginModule. Однако мне интересно, можно ли получить доступ к удаленному EJB в пользовательском модуле входа в систему.

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


person Hank    schedule 05.05.2010    source источник


Ответы (1)


Хорошо, я сам нашел ответ: отлично работает! Я могу получить ссылку на удаленный 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);
    }

}

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

person Hank    schedule 05.05.2010
comment
да. Я хочу увидеть ваш код. Мне нужно решить эту проблему. Спасибо. - person ; 08.02.2012
comment
Код добавлен. К настоящему времени я больше не использую этот подход, хотя он работал так, как ожидалось. Однако я нашел развертывание в кластерной среде слишком сложным. Вместо этого я теперь использую простой ResourceFilter перед ресурсами REST, требующими аутентификации. Гораздо проще, все в той же ВОЙНЕ. - person Hank; 09.02.2012