PB utilisation API de gestion des accès (Portal Access Control SPI), ClassCastException AccessControlHome
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:
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:
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