Contrôle d'accès RBAC
Principe
Lutece propose, pour les fonctionnalités d'administration du Back Office, des contrôles d'accès à des ressources basés sur des rôles (Role Base Access Control - RBAC).
Le principe peut s'appliquer sur tout type de ressources qui aura été préalablement définie (exemple : Page, Document, Espace documentaire, Ressource Métier, ...). Il est possible également de définir autant de permissions que de besoin sur une ressource (exemple : voir, modifier, supprimer, ...).
La configuration d'un rôle RBAC est une fonction standard de Lutece. Elle permet de définir des permissions à une ensemble de ressources. Il est possible d'associer une, plusieurs ou toutes les permissions à une, plusieurs ou toutes les ressources d'un type donné.
Mode d'emploi
Définition de la ressource à contrôler
La ressource à contrôler doit implémenter l'interface RBACResource. Ceci correspond à définir deux méthodes :
- l'une pour définir le nom du type de la ressource
- l'autre doit renvoyer l'identifiant de la ressource.
Par ailleurs, la ressource peut déjà exposer les constantes correspondant aux différentes permissions gérées.
public class MyResource implements RBACResource { // RBAC management public static final String RESOURCE_TYPE = "MY_RESOURCE"; // Perimissions public static final String PERMISSION_VIEW = "VIEW"; public static final String PERMISSION_CREATE = "CREATE"; public static final String PERMISSION_MODIFY = "MODIFY"; public static final String PERMISSION_DELETE = "DELETE"; //////////////////////////////////////////////////////////////////////////// // RBAC Resource implementation /** * {@inheritDoc} */ @Override public String getResourceTypeCode( ) { return RESOURCE_TYPE; } /** * {@inheritDoc } */ @Override public String getResourceId( ) { return String.valueOf( _nId ); // for exemple } }
Création du service de gestion de la ressource
Ce service doit étendre la classe ResourceIdService en définissant 3 méthodes :
- une méthode register pour enregistrer ce service auprès du service RBAC de Lutece,
- une méthode getResourceIdList pour fournir la liste de tous les identifiants des ressources à contrôler
- une méthode getTitle permettant de donner le nom d'une ressource donnée en gérant éventuellement la langue de l'utilisateur.
public class MyResourceIdService extends ResourceIdService { private static final String PROPERTY_LABEL_RESOURCE_TYPE = "myplugin.rbac.myresource.resourceType"; private static final String PROPERTY_LABEL_VIEW = "myplugin.rbac.myresource.permission.view"; /** * {@inheritDoc} */ @Override public void register( ) { ResourceType rt = new ResourceType( ); rt.setResourceIdServiceClass( MyResourceIdService .class.getName( ) ); rt.setPluginName( Constants.PLUGIN_NAME ); rt.setResourceTypeKey( MyResource.RESOURCE_TYPE ); rt.setResourceTypeLabelKey( PROPERTY_LABEL_RESOURCE_TYPE ); Permission p = new Permission( ); p.setPermissionKey( MyResource.PERMISSION_VIEW ); p.setPermissionTitleKey( PROPERTY_LABEL_VIEW ); rt.registerPermission( p ); // ... for all permissions ResourceTypeManager.registerResourceType( rt ); } /** * {@inheritDoc} */ @Override public ReferenceList getResourceIdList( Locale locale ) { List<MyResource listMyResources = MyResourceHome.getList( ); return ReferenceList.convert( listFeatures, "id", "name", true ); } /** * {@inheritDoc} */ @Override public String getTitle( String strId, Locale locale ) { MyResource myresource= MyResourceHome.findByPrimaryKey( Integer.parseInt( strId ) ); return myresource.getName( ); } }
Déclaration du service de gestion de la ressource
Le service de gestion de ressource doit être déclaré dans le fichier de configuration du plugin (plugin-myplugin\webapp\WEB-INF\plugins\myplugin.xml) :
<!-- RBAC Resources --> <rbac-resource-types> <rbac-resource-type> <rbac-resource-type-class>fr.paris.lutece.plugins.myplugin.service.MyResourceIdService</rbac-resource-type-class> </rbac-resource-type> ... </rbac-resource-types>
Vérification d'une permission sur une ressource
La vérification d'une permission peut être faite de la manière suivante :
AdminUser user = getUser(); if ( RBACService.isAuthorized( myresource, MyResource.PERMISSION_VIEW, user ) ) { ... }