Table des matières

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 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 :

  1. Jointer la table dossiers et listtypdossiers sur les champs DOSSIERS_TYPID et LISTTYPDOSSIERS_ID
  2. Jointer la table dossiers et droitsdossiers sur les champs DOSSIERS_TYPID et DROITSDOSSIERS_TYPID
  3. Jointer la table droitsdossiers et _secusr sur les champs DROITSDOSSIERS_SECGRPID et SECUSR_SECGRPID
  4. 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é.