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