Jan 27, 2016 8:56:55 AM Fran├ºois Gandemer avatar   641    

Contrôle d'accès RBAC

Principe

Lutece propose, pour les fonctions de 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éfini (exemple : Page, Document, Espace documentaire, Ressource Métier, ...). Il 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 définir des permissions à une ensemble de ressources. Il est possible de 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 resources à 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 ) )
     {
              ...
     }