===== Arborescence et droits ===== Objectif : Mettre en place une requête avec arborescence et permettant une gestion des droits d'accès. Avant-propos : La gestion des droits sur les requêtes s'effectue par la mise en place de [[roles|rôles]], mais ici nous n'avons qu'une seule requête et nous voulons restreindre l'accès à certains résultats pour des utilisateurs donnés. Solution : Nous allons créer une table de droits qui fera le lien entre un champ de notre table //métier// et le champ **SECUSR_SECGRPID** de la table **_secusr ** Exemple : Nous avons une table nommée **dossiers**, qui est notre table principale, et une table **listtypdossiers**, référençant les différents types de dossiers. Table dossiers : ^ DOSSIERS_ID ^ DOSSIERS_TYPID ^ DOSSIERS_DESC ^ | 1 | 1 | Dossier Sanzot | | 2 | 2 | Dossier top secret | | 3 | 1 | Dossier COGIP | Le champ **DOSSIERS_TYPID** fait le lien avec la table listtypdossiers (il référence la clé primaire de cette table) et nous permettra via une jointure d'afficher le type de dossier plutôt que son identifiant. Table listtypdossiers : ^ LISTTYPDOSSIERS_ID ^ LISTTYPDOSSIERS_DESC ^ | 1 | DOSSIER TECHNIQUE | | 2 | DOSSIER DIRECTION | Dans notre système nous avons deux groupes d'utilisateurs : **Technicien** et **Direction**. Nous voulons que les utilisateurs de ces deux groupes aient accès à la requête **dossiers**. Mais nous ne voulons pas que les utilisateurs du groupe Technicien voient les dossiers du type //"DOSSIER SECRET"//. On ne peut pas faire cela avec les rôles. Les rôles ne permettent pas de restreindre les accès à des résultats précis. Ce que nous pouvons faire c'est de déterminer quel groupe a accès à quel(s) type(s) de dossiers. Il nous faut une table supplémentaire : Table droitsdossiers : ^ DROITSDOSSIERS_ID ^ DROITSDOSSIERS_TYPID ^ DROITSDOSSIERS_SECGRPID ^ | 1 | 1 | 1 | | 2 | 2 | 1 | | 3 | 1 | 2 | Pour information voici ce que serait la table _secgrp : ^ SECGRP_ID ^ SECGRP_DESC ^ | 1 | Direction | | 2 | Technicien | A présent nous avons toutes les informations nécessaires dans la base de données pour simuler une gestion des droits dans notre requête. Pour cela nous allons : - Jointer la table dossiers et listtypdossiers sur les champs DOSSIERS_TYPID et LISTTYPDOSSIERS_ID - Jointer la table dossiers et droitsdossiers sur les champs DOSSIERS_TYPID et DROITSDOSSIERS_TYPID - Jointer la table droitsdossiers et _secusr sur les champs DROITSDOSSIERS_SECGRPID et SECUSR_SECGRPID - Créer une condition portant sur le champ SECUSR_ID pour que sa valeur soit égale à l'id de l'utilisateur connecté (via $secusrid$). La requête ressemblera à ceci : SELECT * FROM dossiers LEFT JOIN listtypdossiers ON ( dossiers.TYPID = listtypdossiers.ID ) LEFT JOIN droitsdossiers ON ( dossiers.TYPID = droitsdossiers.TYPID ) LEFT JOIN _secusr ON ( droitsdossiers.SECGRPID = _secusr.SECUSR_SECGRPID ) WHERE _secusr.SECUSR_ID = $secusrid$ Où $secusrid$ sera remplacé par l'identifiant de l'utilisateur connecté.