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

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