Contrôle d’accès RBAC
Table des matières
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";
// Permissions
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(listMyResources, "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))
{
...
}