Bonjour,

Je voudrais utiliser le "Portal Access Control SPI" (L'API de gestion des accès portail) pour pouvoir contrôler les droits d'accès de mon utilisateur courant sur les pages du portail.

Voici le code utilisé:
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
 
import com.ibm.portal.Identifiable;
import com.ibm.portal.ObjectID;
import com.ibm.portal.ac.AccessControlHome;
import com.ibm.portal.ac.AccessControlRuntimeModel;
import com.ibm.portal.ac.exception.AccessControlException;
import com.ibm.portal.ac.exception.MissingAccessRightsException;
import com.ibm.portal.ac.exception.SystemException;
import com.ibm.wps.portlets.admin.shared.ContextUtil;
...
public static boolean isCurrentUserHasPermissionOnObject(com.ibm.portal.ac.data.RoleType pRoleType,String pUniqNameObject){
 
	// cf http://publib.boulder.ibm.com/infocenter/wpexpdoc/v6r1/topic/com.ibm.wp.exp.doc_v615/dev/wpspacspi.html
	// cf http://publib.boulder.ibm.com/infocenter/wpexpdoc/v6r1/topic/com.ibm.wp.exp.doc_v615/dev/wpsobjid.html
 
	javax.naming.Context ctx;
	boolean isAllowed=false;
 
	try {
		ctx = new javax.naming.InitialContext();
 
		AccessControlHome home = (AccessControlHome) ctx.lookup(AccessControlHome.JNDI_NAME);
		Name uniqueName = new CompositeName("portal:uniquename");
		uniqueName.add(pUniqNameObject);
		ObjectID aUniqNameObject= (ObjectID) ctx.lookup(uniqueName);
		AccessControlRuntimeModel runtimeModel = home.getAccessControlRuntimeModel((Identifiable) aUniqNameObject);
 
		ActionRequest aActionRequest = (ActionRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		com.ibm.portal.um.User user = ContextUtil.getUser((ServletRequest) aActionRequest);
 
		isAllowed = runtimeModel.hasPermission(  user, pRoleType); // ex RoleType.EDITOR
 
		System.out.println("Is Object ["+pUniqNameObject+"] allowed for ["+pRoleType.getName()+"] role : "+isAllowed);
 
	} catch (NamingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SystemException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (MissingAccessRightsException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (AccessControlException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
 
	return isAllowed;
}
Lorsque j'utilise cette fonction dans ma portlet j'ai l'exception:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
[12/1/10 10:23:52:574 CET] 0000004c servlet       E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E: 
Uncaught exception created in one of the service methods of the servlet myPortlet in application PA_myPortlet. Exception created :
javax.servlet.ServletException: javax.portlet.PortletException: com.ibm.wps.ac.api.AccessControlHomeImpl incompatible with com.ibm.portal.ac.AccessControlHome
...
Caused by: java.lang.ClassCastException: com.ibm.wps.ac.api.AccessControlHomeImpl incompatible with com.ibm.portal.ac.AccessControlHome
Cette erreur porte sur la ligne:
AccessControlHome home = (AccessControlHome) ctx.lookup(AccessControlHome.JNDI_NAME);

Dans le classpath de la portlet j'ai rajouté les librairies: "wp.ac.api.jar" and "wp.ac.impl.jar" récupérées depuis les répertoires <InstallPortalHome>/base/wp.ac.api/shared/app and <InstallPortalHome>/base/wp.ac.impl/shared/app

Remarque: Websphere portal est en version 6.1.5

Quelqu'un a-t-il une idée sur la cause de ce problème ?

merci