Bonjour à tous,

Mon premier poste ici pour donner une info qui pourrait en aider plus d'un.

Objectif : Connection à un websphere process server à partir d'une application java pure (thinClient dans les forums IBM) pour récupérer un EJB (HumanTaskManagerHome) en remoting distant.

Information et mots clés :
- Websphere Integration Development
- Websphere Process Server
- JAAS
- RMI activé au niveau server sur le port 2809 (port par défaut)

Mon code pour la connection :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.security.PrivilegedAction;
import java.util.Hashtable;
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
 
import com.ibm.task.api.HumanTaskManager;
import com.ibm.task.api.HumanTaskManagerHome;
import com.ibm.websphere.security.auth.WSSubject;
import com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl;
 
 
 
....................
 
 
 
// On ecrase la partie recup de Spring
try {
 
LoginContext lc = new LoginContext("WSLogin",
new WSCallbackHandlerImpl("admin", "admin"));
lc.login();
 
Subject sub = lc.getSubject();
 
PrivilegedAction monAction = new PrivilegedAction() {
public Object run() {
try {
 
Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL,
"corbaloc:iiop:localhost:2809");
env
.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.SECURITY_PRINCIPAL, "admin");
env.put(Context.SECURITY_CREDENTIALS, "admin");
//env.put("useAppServerSecurity", "1");
 
InitialContext context = new InitialContext(env);
Object objInit = context.lookup("");
Object obj = context
.lookup("com/ibm/task/api/HumanTaskManagerHome");
HumanTaskManagerHome humanTaskManagerHome = (HumanTaskManagerHome) PortableRemoteObject
.narrow(obj, HumanTaskManagerHome.class);
 
HumanTaskManager humanTaskManager = humanTaskManagerHome
.create();
System.out.println(humanTaskManager
.getHtmConfiguration().isSubstitutionEnabled()); 
 
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
};
System.out.println("TEST3");
WSSubject.doAs(sub, monAction);
 
 
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 
}

Pour pouvoir vous connecter correctement, il vous faudra ajouter les fichiers de configuration du server dans les arguments de la JVM du client (j'ai pas l'impression d'être super clair là ...) :
-Djava.security.auth.login.config=C:\...\wsjaas_client.conf
-Dcom.ibm.SSL.ConfigURL=file:C:\...\ssl.client.props
-Dcom.ibm.CORBA.ConfigURL=file:C:\...\sas.client.props
Note : Si vous n'ajoutez pas cette config vous aurez une exception "java.lang.SecurityException: Unable to locate a login configuration"

Donc à partir de là, je récupérais l'EJB, mais la sécurité étant activée, je ne pouvais appeler certaines méthodes, et l'erreur était :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
java.rmi.AccessException: CORBA NO_PERMISSION 0x0 No; nested exception is: 
org.omg.CORBA.NO_PERMISSION: 
>> SERVER (id=xxxxxxx, host=xxxxxxxxxxx) TRACE START:
>> org.omg.CORBA.NO_PERMISSION: java.rmi.AccessException: ; nested exception is: 
com.ibm.websphere.csi.CSIAccessException: SECJ0053E: Authorization failed for /UNAUTHENTICATED while invoking (Bean)com/ibm/task/api/HumanTaskManagerHome getHtmConfiguration:1 securityName: /UNAUTHENTICATED;accessID: UNAUTHENTICATED is not granted any of the required roles: TaskAPIUser vmcid: 0x0 minor code: 0 completed: No
>>	 at com.ibm.ws.security.core.SecurityCollaborator.performAuthorization(SecurityCollaborator.java:487)
>>	 at com.ibm.ws.security.core.EJSSecurityCollaborator.preInvoke(EJSSecurityCollaborator.java:247)
>>	 at com.ibm.ejs.container.EJSContainer.preInvokeAfterActivate(EJSContainer.java:3632)
>>	 at com.ibm.ejs.container.EJSContainer.preInvoke(EJSContainer.java:2938)
>>	 at com.ibm.task.api.EJSRemoteStatelessGenericHumanTaskManagerEJB_efcf8cd2.getHtmConfiguration(Unknown Source)
>>	 at com.ibm.task.api._EJSRemoteStatelessGenericHumanTaskManagerEJB_efcf8cd2_Tie._get_htmConfiguration(_EJSRemoteStatelessGenericHumanTaskManagerEJB_efcf8cd2_Tie.java:9127)
>>	 at com.ibm.task.api._EJSRemoteStatelessGenericHumanTaskManagerEJB_efcf8cd2_Tie._invoke(_EJSRemoteStatelessGenericHumanTaskManagerEJB_efcf8cd2_Tie.java:735)
>>	 at com.ibm.CORBA.iiop.ServerDelegate.dispatchInvokeHandler(ServerDelegate.java:627)
>>	 at com.ibm.CORBA.iiop.ServerDelegate.dispatch(ServerDelegate.java:480)
>>	 at com.ibm.rmi.iiop.ORB.process(ORB.java:512)
>>	 at com.ibm.CORBA.iiop.ORB.process(ORB.java:1571)
>>	 at com.ibm.rmi.iiop.Connection.respondTo(Connection.java:2719)
>>	 at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2584)

La cause de cette erreur était très ... je ne dirai pas les mots.

Dans mes arguments de JVM, j'avais oublié un "." entre ibm et CORBA pour l'argument -Dcom.ibm.CORBA.ConfigURL (j'avais -Dcom.ibmCORBA.ConfigURL

Voilà, après avoir vérifier toute la config serveur, tout le code client, on a fini par trouver cela. L'exception générée n'est pas très parlante. Apparement, la présence des fichiers wsjaas_client.conf et ssl.client.props ferait que des paramètres par défaut serait chargé pour l'argument -Dcom.ibm.CORBA.ConfigURL.

Voilà qui pourrait des pistes à ceux qui rencontrent un problème similaire.

A+
Raziel.