Пользовательский принципал не будет передаваться в EJB SessionContext в Jboss AS - PullRequest
4 голосов
/ 25 октября 2011

В EJB-проекте мне нужно заменить имя принципа вызова в "javax.ejb.SessionContext". Я использую Jboss AS 6.0 Final в качестве сервера приложений.

Я определил пользовательский модуль UserLoginModule, который расширяет UsernamePasswordLoginModule, и добавил пользовательский участник, но мой пользовательский участник не будет распространен в EJB SessionContext.

Вот код из моего пользовательского модуля входа в систему:

@Override
protected Group[] getRoleSets() throws LoginException {

    Group[] groups = new Group[2];
    groups[0] = new SimpleGroup("Roles");
    groups[0].addMember(createRoleIdentity());

    Group callerPrincipal = new SimpleGroup("CallerPrincipal");
    callerPrincipal.addMember(createIdentity(this.getUsername()));
    groups[1] = callerPrincipal;
    subject.getPrincipals().add(callerPrincipal);

    return groups;
}

@Override
protected Principal createIdentity(String username) throws LoginException {
    return new MyCustomPrincipal(username);
}

}

Мой пользовательский модуль входа в систему работает хорошо, но принцип вызова, который я получаю из "javax.ejb.SessionContext", по-прежнему SimplePrincipal.

Оказалось, что есть ошибка Jobss: EJBContext.getCallerPrincipal () не возвращает пользовательский принципал https://issues.jboss.org/browse/JBAS-8427

И связанная тема: http://community.jboss.org/thread/44388.

Интересно, есть ли у вас какой-то опыт по этому вопросу, и безопасно ли заменить основной принцип по умолчанию, который создает Jboss? Есть ли побочные эффекты?

1 Ответ

3 голосов
/ 26 октября 2011

С помощью моей команды я получил решение, надеюсь, это может быть полезно для тех, у кого такая же проблема.

Вместо "sessionContext.getCallerPrincipal ()" Используйте следующее, чтобы получить пользовательскийосновной:

        try {
            Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");

            Set<Group> subjectGroups = subject.getPrincipals(Group.class);
            Iterator<Group> iter = subjectGroups.iterator();
            while (iter.hasNext()) {
                Group group = iter.next();
                String name = group.getName();
                if (name.equals("CallerPrincipal")) {
                    Enumeration<? extends Principal> members = group.members();
                    if (members.hasMoreElements()) {

                               Principal principal = (Principal) members.nextElement();
                               return principal;

                        }
                    }
                }
            }
        } catch (PolicyContextException e1) {
            ...
        } 
...