9 nov. 2021, 15:42:10 Thomas Dumont

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))
{
    ...
}