Sommaire |
Ce chapitre aborde la gestion de la sécurité dans Maarch Framework 3 au sens large, c'est à dire en passant en revue tout ce qui est relatif aux restrictions d'utilisation.
Maarch gère trois concepts de sécurité distincts, en réponse aux questions suivantes :
> c'est la question du périmètre documentaire
> c'est la question du profil d'utilisation
> c'est la question du positionnement dans l'organisation
Un problème reccurent des grands logiciels de GED est qu'ils positionnent la sécurité au niveau de chaque document, au moyen de listes de contrôle d'accès (ACL). Cette méthode consomme beaucoup de ressource machine, tant en mise à jour qu'en consultation. De plus, elle est très mal adaptée à la problématique de l'archive, puisque pour réviser la politique de sécurité d'une organisation, il faut repasser sur chaque document pour modifier les ACL.
Le schéma de sécurité Maarch est bien mieux adapté à de gros volumes d'archives intermédiaires ou définitives. Il est basé sur du filtrage en accès, pour un groupe donné : Lorsqu'un utilisateur se connecte, la liste des groupes auxquels il appartient est constituée. Chaque groupe dispose d'accès à une ou plusieurs collections, et se voit filtrer l'accès à la collection par une clause where de restriction.
Par exemple, un groupe Service pourra uniquement voir les documents dont l'indicateur de confidentialité est positionné à faux, alors que le groupe Direction pourra tout voir.
Voici le schéma de donnée entrant en jeu dans la définition du périmètre documentaire :
Dans un premier temps, les utilisateurs doivent être déclarés dans la table users :
Dans le même temps, les groupes sont déclarés dans la table usergroups, puis les utilisateurs sont attachés à ces groupes via la relation usergroup_content :
usergroups :
usergroup_content :
Voyons maintenant comment sont décrites les ressources.
Avec Maarch, les descripteurs de ressources électroniques sont placés dans des tables de type res_x. Cependant, du point de vue de l'utilisateur et de l'administrateur, les ressources sont connues sous le nom de Collections Maarch. La collection est l'abstraction d'un dépôt de ressource. Elle est composée d'un table où les données sont stockées, une vue SQL par laquelle elles sont restituées, une description et une id.
Les collections sont définies dans <application>/xml/config.xml :
<COLLECTION> <COLLECTION_ID>COLL_INVOICE_2008</COLLECTION_ID> <COLLECTION_TABLE>res_invoice_2008</COLLECTION_TABLE> <VIEW>view_invoice_2008</VIEW> <LABEL>Invoices year 2008</LABEL> </COLLECTION> <COLLECTION> <COLLECTION_ID>COLL_INVOICE_2009</COLLECTION_ID> <COLLECTION_TABLE>res_invoice_2009</COLLECTION_TABLE> <VIEW>view_invoice_2009</VIEW> <LABEL>Invoices year 2009</LABEL> </COLLECTION>
Dans cet exemple, la collection 'COLL_INVOICE_2008' référence des documents stockés dans la table res_invoice_2008. Parceque les données d'une ressource peuvent faire appel à des tables de référence pour afficher des libellés, les recherches et listes de résultat utilisent des vues SQL qui résolvent ces références (par exemple, retrouver CUSTOMER_NAME à partir de CUSTOMER_ID).
Quand vous définissez la vue SQL, n'oubliez pas de créer une colonne 'COLLECTION_ID', renseignée avec l'id de la collection utilisée pour accéder et mettre à jour la ressource. Cette colonne est utilisée pour connaitre la table à mettre à jour, dans le cas d'une collection multitable.
Une collection multitable permet de lancer des recherches sur des ressources réparties sur plusieurs collections primaires (partitionnement logiciel). dans le fichier de definition de la collection, le tag COLLECION_TABLE n'est pas renseigné, et la définition de la vue implique plus d'une table.
Pour autoriser des recherches sur toutes les factures, la définition de la collection sera :
<COLLECTION> <COLLECTION_ID>COLL_INVOICE_ALL</COLLECTION_ID> <COLLECTION_TABLE></COLLECTION_TABLE> <VIEW>view_invoice_all</VIEW> <LABEL>All invoices</LABEL> </COLLECTION>
view_invoice_all est l'union de res_invoice_2008 and res_invoice_2009 :
SELECT "COLL_INVOICE_2008" as COLLECTION_ID, DOCDATE, ... FROM res_invoice_2008 UNION SELECT "COLL_INVOICE_2009" as COLLECTION_ID, DOCDATE, ... FROM res_invoice_2009
Maintenant que nous avons défini le dépôt de ressource, nous n'avons plus qu'à filtrer l'accès du groupe à la collection, via la table security :
N'ayez pas peur, tout cela se gère très bien via les écrans d'administration Maarch :
Le profil d'utilisation est l'inventaire des capacités de l'utilisateur à manipuler les fonctions proposées par la couche de présentation Maarch.
Maarch dispose de modules proposant des fonctionnalités exposées en tant que services.
Les services disponibles figurent par module dans <module>/xml/services.xml. Les services de nature "utilisateur" (et non "système") peuvent être affectés à un groupe, afin que les utilisateurs de ce groupe puissent en tirer parti.
Dans Administration/Groupes, partie gauche, un profil administrateur peut affecter les différents services :
Le résultat du paramétrage se retrouve dans la table usergroups_services.
Notez que l'application propose elle-aussi les services qui lui sont propres.
Les autorisations sont cumulatives : elles s'ajoutent les unes aux autres en fonction des groupes d'appartenance de l'utilisateur.
(Applicable depuis la version 3.1 du Framework)
Il s'agit ici de définir l'organisation hiérarchique appliquée dans l'entreprise, afin de savoir où chacun se situe, et d'impacter la gestion de la sécurité en conséquence.
En particulier, la position dans l'organisation (ex: l'appartenance à une direction, un service ou un bureau particulier) va permettre de gérer strictement :
Pour démarrer, il faut représenter l'organisation. Prenons l'exemple d'une mutuelle disposant de l'organisation suivante :
Direction Générale Juridique Contrôle Interne Comptabilité et Contentieux Comptabilité Contentieux Stratégie Opérationnelle Communication Marketing Commercial (Individuels) Commercial (Entreprises) Département Informatique Etudes Systèmes et réseaux Processus et Relations Clients Statistiques Département Gestion des Entreprises Service contrats entreprises complexes Autres contrats entreprises Tiers (Prises en charges, tiers payant,…) Service Gestion des Individuels Accueil (téléphone et visites) Courrier – Reprographie Moyens généraux
C'est une structure relativement simple à deux niveaux, à laquelle s'ajoute un niveau "chapeau" que l'on va appeler "ACME S.A.", du nom de cette société fictive.
Dans Administration/Entités (à condition que le module entities soit connecté), vous allez pouvoir définir les composants hiérarchiques de l'organisation.
Le résultat est stocké dans une seule table reflexive Maarch : entities.
Si le module Entities est connecté, il devient possible de rattacher un utilisateur à une entité, dans Administration/Utilisateurs. La liste des entités disponibles à l'affectation dépend directement du positionnement de l'administrateur lui-même, qui ne peut qu'affecter des entités au niveau inférieur du sien.
Le résultat de l'affectation est stocké dans la table de relation users_entities.
Une fois l'organisation définie, vous allez pouvoir utiliser des variables de contexte décrivant les services autorisés :
Exemple dans la définition de la sécurité d'un groupe ("where clause") : accès sur les ressources concernant le service d'appartenance principal de l'utilisateur connecté, ou les sous-services de ce service.
where_clause : (DESTINATION = @my_primary_entity or DESTINATION in (@subentities[@my_primary_entity]))
Remarque : la variable de contexte suivante était déjà disponible dans le Core 3.0 :
Pour la gestion des corbeilles, nous avons créé des mots-clé reprenant ces variables de contexte, qui ne sont pas visibles directement, mais apparaissent sous leurs intitulés :