Вопрос по java-ee, jboss, websphere, java, jaas – Как распространить тему JAAS при вызове удаленного EJB (RMI поверх IIOP) с чистого клиента

9

Я проверяю распространениеJAAS Тема стаможенный руководитель от автономного клиента EJB, работающего в сырой среде выполнения Java, до сервера JavaEE. Я нацеливаюсь на обе реализации JBoss и WebSphere.

В соответствии сэта ветка форума Я ожидал, что это сработает с JBoss легко.

Вот мой фрагмент кода клиента EJB:

Subject subject = new Subject();
Principal myPrincipal = new MyPrincipal("me I myself");
subject.getPrincipals().add(myPrincipal);

PrivilegedExceptionAction<String> action = new PrivilegedExceptionAction<String>() {
    public String run() throws Exception {
            String result;
            System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
            InitialContext ic = new InitialContext();
            Business1 b = (Business1) ic.lookup("StatelessBusiness1");
            result = b.getNewMessage("Hello World");
            return result;
        }
    };

result = subject.doAs(subject, action);
System.out.println("result "+result);

Код на стороне сервера:

public String getNewMessage(String msg) {
    System.out.println("getNewMessage principal: " + sessionContext.getCallerPrincipal());
    System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
    return "getNewMessage: " + msg;
}

Конечно, даже если это поведение по умолчанию, я добавил этот раздел в свойejb-jar.xml сессионный компонент:

<security-identity>
   <use-caller-identity/>
</security-identity>

Мой сессионный компонент не защищен никакой ролью.

В соответствии сэтот раздел информационного центра IBM WebSphereЯ также включил системное свойствоcom.ibm.CSI.rmiOutboundPropagationEnabled=true.

Технически говоря, сервисный вызов работает должным образом либо на JBoss, либо на WebSphere. Но тема JAAS, включая мой пользовательский субъект, созданный на клиенте, не распространяется на сервер. Или, конечно,Subject сбрасывается непосредственно перед созданием контекста JNDI и вызовом EJB все в порядке.

Я запускаю одну и ту же версию среды выполнения Java для сервера и клиента (IBM Java6 SR9 FP2 ...),MyPrincipal Сериализуемый класс доступен на сервере ClassPath (AppServer/lib/ext для WebSphere,server/default/lib для JBoss)

Дампы WebSphere:

[8/31/12 11:56:26:514 CEST] 00000024 SystemOut     O getNewMessage principal: UNAUTHENTICATED
[8/31/12 11:56:26:515 CEST] 00000024 SystemOut     O Current Subject: null

JBoss сбрасывает:

 12:30:20,540 INFO  [STDOUT] getNewMessage principal: anonymous
 12:30:20,540 INFO  [STDOUT] Current Subject: null

Конечно, я пропустил какое-то магическое заклинание. Ты знаешь какой?

Тогда вы более опытны, чем я;) (Я играл с LoginModules, пользовательской аутентификацией, основной переадресацией через RMI-IIOP / CORBA в Glassfish 2.x, и это всегда было очень сложно. В конечном счете, мы просто обрабатывали это в приложении выровняйте себя) Я бы не рекомендовал никому заполнять форму, используя эти стандарты для аутентификации по имени пользователя и паролю. Если цель заключается в интеграции с Kerberos и обеспечении единого входа, это может быть лучшим способом! Извините, я не могу помочь больше. ewernli
Так ? Я уже успешно написал собственный LoginModule для поддержки WebSphere и Tivoli PDPrincipal, я настроил LoginModule в JBoss для включения Kerberos SPNEGO через HTTP ... Определенно, я доволен JAAS и другими вещами. Я просто спрашиваю, ошибаюсь ли я, думая, что это должно работать ... перед открытием исходного кода JBoss для проверки Yves Martin
На самом деле цель состоит в том, чтобы обойти отказ от использования Kerberos с WebSphere в нашем конкретном контексте:stackoverflow.com/questions/10518057/… Yves Martin

Ваш Ответ

2   ответа
3

что на сервере WAS не включена защита. Поскольку защита не включена и вы не прошли аутентификацию в WAS, учетные данные отсутствуют. Таким образом, ваш призыв кgetCallerPrincipal возвращается неутвержденным.

Если вы включите безопасность приложения в WAS, вам придется пройти аутентификацию черезПротокол CSIv2, Создание собственной темы JAAS в автономном клиенте не поможет. Если бы это было возможно, то любой мог бы создать «эй, это я». учетные данные и вход в любой удаленный EJB, который они хотели.

Ваш код будет работать на сервере, подключая ваш субъект к запущенному потоку выполнения. Передача субъектов / учетных данных по сети требует протокола для осуществления сериализации информации о субъекте и обеспечения доверия стороны, утверждающей личность в учетных данных. От автономного клиента WAS принимает информацию о пользователе в форме базовой авторизации, LTPA и Kerberos. Это можно настроить для входящей конфигурации CSIv2 в консоли администратора. Это задокументировано в ссылке на информационный центр, на которую я ссылался ранее.

Это забавная штука. Удачи.

Спасибо, и вы правы, для JBoss требуется определенный LoginModule. Поскольку распространение WebSphere - не самая легкая часть, поэтому я решил настроить цепочку аутентификации с помощью пользовательского LoginModule, а затем клиентская JVM должна быть настроена с sas.client.properties в com.ibm.CORBA.ConfigURL. В любом случае методы EJB должны быть защищены. Yves Martin
0

это поможет вам с ценой использовать проприетарные веб-сферы. насколько я помню, websphere НЕ распространяет jaas caller-subject, это типично для ibm

    package foo.bar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.security.auth.Subject;
import javax.security.auth.login.CredentialExpiredException;
import org.apache.log4j.Logger;
import com.ibm.websphere.security.WSSecurityException;
import com.ibm.websphere.security.auth.CredentialDestroyedException;
import com.ibm.websphere.security.auth.WSSubject;
import com.ibm.websphere.security.cred.WSCredential;

public class IdentityHelper
{
    private static final Logger log = Logger.getLogger(IdentityHelper.class);
    private static final String CLASS_OBJECT = "java.util.HashMap";
    private static final String KEY_OBJECT = "java.lang.String";
    private static final String VALUE_OBJECT = "java.util.HashSet"; 

    private Subject subject=null;
    private WSCredential creds;
    private Set publicCredentials=null;
    public IdentityHelper(Subject _subject) throws WSSecurityException
    {
        if(_subject==null)
        {
            IdentityHelper.log.warn("given subject was null, using Caller-Subject or the RunAs-Subject!");
            this.subject = WSSubject.getCallerSubject();
            if(this.subject==null)this.subject=WSSubject.getRunAsSubject();
        }
        else
        {           
            this.subject=_subject;
        }
        init();
    }
    public IdentityHelper() throws WSSecurityException
    {
        this.subject=WSSubject.getRunAsSubject();
        if(this.subject==null)
        {
            IdentityHelper.log.warn("using Caller-Subject NOT the RunAs-Subject!");
            this.subject = WSSubject.getCallerSubject();
        }
        init();
    }

    private void init() throws WSSecurityException
    {
        Set<WSCredential> credSet= this.subject.getPublicCredentials(WSCredential.class);
        //set should contain exactly one WSCredential
        if(credSet.size() > 1) throw new WSSecurityException("Expected one WSCredential, found " + credSet.size());
        if(credSet.isEmpty())
        {
            throw new WSSecurityException("Found no credentials");
        }
        Iterator<WSCredential> iter= credSet.iterator();
        this.creds=(WSCredential) iter.next();
        this.publicCredentials=this.subject.getPublicCredentials();
    }
    public WSCredential getWSCredential() throws WSSecurityException
    {
        return this.creds;
    }
    public List<String> getGroups() throws WSSecurityException,CredentialDestroyedException,CredentialExpiredException
    {
        WSCredential c = this.getWSCredential();
        return c.getGroupIds();
    }
    /**
     * helper method for obtaining user attributes from Subject objects.
     * @param subject
     * @return
     */
    @SuppressWarnings("unchecked")
    public Map<String, Set<String>> getAttributes()
    {
        Map<String, Set<String>> attributes = null;
        Iterator<?> i = this.subject.getPublicCredentials().iterator();
        while (attributes == null && i.hasNext())
        {
            Map<String, Set<String>> tmp = null;
            Object o = i.next();
            if(IdentityHelper.log.isDebugEnabled())
            {
                IdentityHelper.log.debug("checking for attributes (class name): " + o.getClass().getName());
            }
            if(!o.getClass().getName().equals(CLASS_OBJECT))
                continue;//loop through
            tmp = (Map) o;
            Object tObject = null;
            Iterator<?> t = null;
            t = tmp.keySet().iterator();
            tObject = t.next();
            if(IdentityHelper.log.isDebugEnabled())
            {
                IdentityHelper.log.debug("checking for attributes (key object name): " + tObject.getClass().getName()); 
            }
            if(!tObject.getClass().getName().equals(KEY_OBJECT))
                continue;//loop through
            t = tmp.values().iterator();
            tObject = t.next();
            if(IdentityHelper.log.isDebugEnabled())
            {
                IdentityHelper.log.debug("checking for attributes (value object name): " + tObject.getClass().getName()); 
            }
            if(!tObject.getClass().getName().equals(VALUE_OBJECT))
                continue;//loop through
            attributes = (Map) o;
        }
        if (attributes == null)
        {
            attributes = new HashMap<String, Set<String>>(); 
        }
        return attributes;
    }
    public Subject getSubject()
    {
        return this.subject;
    }
    protected Set getPublicCredentials() {
        return publicCredentials;
    }


}

смотрите также:Получение темы звонящего из потока для JAAS а такжеПолучение темы RunAs из потока

Я сдался, насколько должна быть включена защита "глобально" в Websphere для работы, и для получения единого входа может потребоваться проверка подлинности Kerberos, не запрашивая у пользователей проверки подлинности при включенной защите. В качестве обходного пути я разработал реализацию ORB PortableInterceptor для добавления сообщений IIOP с моим собственным контекстом, в котором я сохранил имя пользователя для входа. Yves Martin

Похожие вопросы