Créer une gestion des droits des utilisateurs avec Access

Denis Hulo

Objectif : réaliser un système permettant de gérer les droits des utilisateurs d'une base Access installée en réseau.

Niveau requis : confirmé.

Commentez cet article : Commentez

- Titre : Créer une gestion des droits des utilisateurs avec Access

- Auteur : Denis Hulo

- Parution : 1 décembre 2020

- Public visé :

- Licence : Copyright ® 2020 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Tables nécessaires

- II-A. Table T_Utilisateur

- II-B. Table T_Groupe

- II-C. Table T_Droit_Formulaire

- II-D. Table T_Droit_Controle

- III. Requêtes

- III-A. R_Droit_Formulaire

- III-B. R_Droit_Controle

- IV. Formulaires de saisie des droits

- V. Formulaire d'authentification

- VI. Récupération du nom d'utilisateur

- VII. Procédure de paramétrage du formulaire

- VIII. Appels de la procédure « Sur ouverture » du formulaire

- IX. Précautions supplémentaires à prendre

- IX-A. Désactiver la touche MAJ

- IX-B. Définir un mot de passe

- X. Conclusion

- XI. Base de données à télécharger

- XII. Remerciements

I - Introduction

La gestion des droits des utilisateurs ayant été abandonnée depuis Access 2007, on propose dans cet article de décrire comment mettre en place son propre système de gestion des autorisations.

La base de données est utilisée en mode multiutilisateur, avec sur le serveur le fichier de données et sur les postes clients l'interface utilisateur :

Installation en réseau

On souhaite dans cette situation enregistrer dans des tables côté serveur les autorisations des utilisateurs :

- ajout des données ;

- suppression des données ;

- modification des données ;

- accès aux données confidentielles ;

- …

Puis, exécuter une procédure permettant de paramétrer les formulaires en fonction des droits accordés à l'utilisateur :

- propriété « ajout autorisé » à Oui ;

- propriété « suppr autorisée » à Oui ;

- propriété « modif autorisée » à Oui ;

- bouton de commande « droits utilisateur » activé ;

- …

Le système comportera également un formulaire d'authentification lancé au démarrage et du code pour masquer les objets de la base à son ouverture.

Pour identifier la personne ayant ouvert la session, on récupérera son nom d'utilisateur par la méthode de la variable temporaire.

Enfin, en complément, on expliquera au lecteur comment désactiver la touche MAJ pour forcer l'ouverture du formulaire au démarrage, et comment protéger la base par mot de passe.

Les objets et le code détaillés ici sont tous présents dans les deux fichiers disponibles en téléchargement. Comme expliqué dans ce cours, le fichier de données contenant les tables doit être copié côté serveur, et la frontale avec le reste des objets (requêtes, formulaires et modules) doit être installée sur les postes clients.

II - Tables nécessaires

Détaillons tout d'abord la structure des tables contenues dans le fichier de données côté serveur.

II-A - Table T_Utilisateur

Elle permet d'enregistrer les noms des utilisateurs de la base et leur mot de passe.

Nom de la colonne

Type de données

Description

IdUtilisateur

NuméroAuto

Identifiant de l'utilisateur

NomUtilisateur

Texte

Nom de l'utilisateur

IdGroupe

Entier long

Identifiant du groupe : clé étrangère liée à la colonne IdGroupe de la table T_Groupe

MotDePasse

Texte

Mot de passe de l'utilisateur

Le champ [IdUtilisateur] est la clé primaire de la table.

II-B - Table T_Groupe

Elle contient les informations sur les groupes d'utilisateurs.

Nom de la colonne

Type de données

Description

IdGroupe

NumeroAuto

Identifiant du groupe

NomGroupe

Texte

Nom du groupe d'utilisateurs pour lequel on enregistre les autorisations

II-C - Table T_Droit_Formulaire

Elle contient les informations relatives aux droits accordés aux groupes d'utilisateurs pour l'ajout, la suppression et la modification des données sur les différents formulaires.

Nom de la colonne

Type de données

Description

IdDroit

NumeroAuto

Identifiant du droit

IdGroupe

Entier long

Identifiant du groupe : clé étrangère liée à la colonne IdGroupe de la table T_Utilisateur

NomFormulaire

Texte

Nom du formulaire dans lequel on applique les droits pour le groupe

Droit

Texte

Type d'autorisation à paramétrer dans le formulaire : « ajout autorisé », « suppression autorisée », « modif. autorisée »

Coche

Oui/Non

Indique si oui ou non on autorise l'ajout, la suppression ou la modification des données

II-D - Table T_Droit_Controle

Elle contient les informations relatives aux autorisations accordées aux groupes d'utilisateurs pour l'accès aux différents contrôles des formulaires.

Nom de la colonne

Type de données

Description

IdDroit

NumeroAuto

Identifiant du droit

IdGroupe

Entier long

Identifiant du groupe : clé étrangère liée à la colonne IdGroupe de la table T_Utilisateur

NomFormulaire

Texte

Nom du formulaire contenant le contrôle

NomControle

Texte

Nom du contrôle à activer ou à désactiver

Actif

Oui/Non

Indique si le contrôle doit être activé ou pas

III - Requêtes

Présentons ensuite brièvement la structure des requêtes permettant d'afficher les droits pour chaque utilisateur.

III-A - R_Droit_Formulaire

Elle relie les tables T_Utilisateur et T_Droit_Formulaire.

R_Droit_Formulaire

III-B - R_Droit_Controle

Elle fait le lien entre les tables T_Utilisateur et T_Droit_Controle.

R_Droit_Controle

IV - Formulaires de saisie des droits

Le formulaire F_Groupe va permettre à l'administrateur de la base de données de définir les autorisations accordées aux groupes d'utilisateurs au niveau des formulaires et des contrôles. Il est basé sur la table T_Groupe et permet d'enregistrer les droits dans des sous-formulaires.

Formulaire F_Groupe

On constate que le formulaire comporte deux onglets contenant les sous-formulaires basés sur les tables T_Droit_Formulaire et T_Droit_Controle. Ces sous-formulaires sont actualisés en fonction du groupe.

Ensuite, le formulaire F_Utilisateur permet de choisir un groupe pour un utilisateur et ainsi de lui accorder certains droits :

Formulaire F_Utilisateur

Il s'agit d'exemples de formulaires présents dans l'application côté client, libre à vous de réaliser vos propres interfaces utilisateur pour attribuer les droits.

V - Formulaire d'authentification

Il va permettre d'identifier l'utilisateur et de copier son nom dans une variable temporaire pour en disposer durant toute la session.

Formulaire F_Login

Les propriétés Fenêtre contextuelle et Fenêtre Modale, doivent être définies sur Oui, et la propriété Bouton Fermer sur Non :

Propriétés Formulaire F_Login

Pensez également à mettre la propriété Menu Contextuel à Non pour interdire à l'utilisateur d'accéder au mode design par un clic droit.

À l'ouverture du formulaire, on va en plus masquer par du code le volet de navigation et le ruban :

Private Sub Form_Open(Cancel As Integer)
DoCmd.NavigateTo "acNavigationCategoryObjectType"
DoCmd.RunCommand acCmdWindowHide ' on masque le volet de navigation
DoCmd.ShowToolbar "Ribbon", acToolbarNo ' on masque le ruban
End Sub

Ce formulaire est chargé au démarrage de l'application installée sur les postes clients. On peut le paramétrer facilement dans les options Access :

Options Access

On indiquera en plus à la fin de l'article, comment désactiver la touche MAJ pour forcer l'ouverture du formulaire au démarrage.

De cette façon, on a la garantie que la personne ne pourra accéder aux autres objets de la base.

VI - Récupération du nom d'utilisateur

On utilise une variable temporaire pour copier le nom d'utilisateur et en disposer au cours de la session entière.

Par exemple, la création d'une variable NomUtilisateur contenant le nom « Dupont » est réalisée simplement en invoquant la méthode Add de la collection Application.TempVars :

Application.TempVars.Add "NomUtilisateur", "Dupont"

Pour obtenir la valeur contenue dans cette variable, il suffit de faire :

strNomUtilisateur=Application.TempVars("NomUtilisateur").Value

La création de la variable peut se faire au moment de la connexion en exécutant par exemple le code :

strNomUtilisateur=Me.txtNomUtilisateur ' copie du nom d'utilisateur dans une variable
Application.TempVars.Add "NomUtilisateur", strNomUtilisateur ' création de la variable temporaire

La récupération du contenu de la variable temporaire se fait donc simplement par :

strNomUtilisateur=Application.TempVars("NomUtilisateur").Value

Cette méthode nécessite donc la création d'un formulaire de connexion pour identifier l'utilisateur au tout début, et pour copier son nom dans la variable temporaire. L'utilisation d'une variable globale à la place n'est pas recommandée, car elle peut être, sous certaines conditions, réinitialisée en cours de session.

VII - Procédure de paramétrage du formulaire

Elle va paramétrer le formulaire actif en fonction des autorisations accordées aux utilisateurs :

- ajout autorisé ;

- suppr autorisée ;

- modif autorisée ;

- contrôle « cmdOpenFormUsers » activé ;

- …

Déroulé de la procédure

1. Copie du nom d'utilisateur et du nom du formulaire dans des variables ;

2. Ouverture du recordset basé sur la requête R_Droit_Formulaire filtrée avec le nom de l'utilisateur et du formulaire ;

3. Paramétrage du formulaire en fonction des autorisations enregistrées dans la table ;

4. Ouverture du recordset basé sur la requête R_Droit_Controle filtrée avec le nom de l'utilisateur et du formulaire ;

5. Activation ou désactivation des contrôles du formulaire en fonction des autorisations enregistrées dans la table.

Procédure configFormulaire

Public Sub configFormulaire()
' Configurer le formulaire en fonction des autorisations accordées à l'utilisateur
Dim strNomFormulaire As String ' variable contenant le nom du formulaire
Dim strNomControle As String ' variable contenant le nom du contrôle situé dans le formulaire
Dim strNomUtilisateur As String ' variable contenant le nom d'utilisateur
Dim strDroit As String ' variable contenant le droit de l'utilisateur
Dim dbs As DAO.Database ' variable pour faire référence à la base courante
Dim rstDroitsUsers As DAO.Recordset ' variable pour faire référence au recordset basé sur la requête R_Droits_Utilisateurs
Dim frm As Form ' variable objet pour faire référence au formulaire actif

strNomFormulaire = CodeContextObject.Name ' on copie le nom de l'objet dans lequel le code est en cours d'exécution

Set frm = CodeContextObject ' référence au formulaire actif

strNomUtilisateur = Application.TempVars("NomUtilisateur").Value ' copie du nom d'utilisateur contenu dans la variable temporaire NomUtilisateur

Set dbs = CurrentDb ' référence à la base courante

' ouverture du recordset basé sur la requête R_Droit_Formulaire filtrée en fonction du nom d'utilisateur et du nom du formulaire
Set rstDroitsUsers = dbs.OpenRecordSet("select * from R_Droit_Formulaire " & _
"where (NomUtilisateur like """ & strNomUtilisateur & """) and (NomFormulaire like """ & strNomFormulaire & """)")

Do While Not rstDroitsUsers.EOF  ' on parcourt les droits autorisés pour l'utilisateur sur le formulaire

strDroit = rstDroitsUsers!Droit ' on copie le droit dans la variable

If strDroit = "Ajout autorisé" Then ' si ajout autorisé
frm.AllowAdditions = rstDroitsUsers!Coche
Else
If strDroit = "Suppression autorisée" Then ' si suppression autorisée
frm.AllowDeletions = rstDroitsUsers!Coche
Else ' si modif autorisée
frm.AllowEdits = rstDroitsUsers!Coche
End If
End If

rstDroitsUsers.MoveNext ' on se déplace sur le prochain enregistrement

Loop

rstDroitsUsers.Close ' fermeture du recordset

' ouverture du recordset basé sur R_Droit_Controle filtré en fonction du nom d'utilisateur et du nom du formulaire
Set rstDroitsUsers = dbs.OpenRecordSet("select * from R_Droit_Controle " & _
"where (NomUtilisateur like """ & strNomUtilisateur & """) and (NomFormulaire like """ & strNomFormulaire & """)")

Do While Not rstDroitsUsers.EOF  ' on parcourt les droits autorisés pour l'utilisateur sur les contrôles du formulaire

strNomControle = rstDroitsUsers!NomControle ' on copie le nom du contrôle dans la variable
frm(strNomControle).Enabled = rstDroitsUsers!Actif ' on active ou pas le contrôle suivant l'autorisation accordée

rstDroitsUsers.MoveNext ' on se déplace sur le prochain enregistrement

Loop

' libération des variables

Set frm = Nothing

rstDroitsUsers.Close
Set rstDroitsUsers = Nothing

Set dbs = CurrentDb
End Sub

La procédure doit être copiée dans un module standard pour être appelée sur l'événement ouverture des formulaires.

Le code permettant d'accéder aux données utilise la bibliothèque DAO, mais vous pouvez également utiliser ADODB et les procédures stockées en déplaçant le code SQL côté dorsal. Le code adapté est d'ailleurs disponible dans le fichier « gestion-droits-utilisateurs-adodb.accdb » proposé à la fin de l'article.

VIII - Appels de la procédure « Sur ouverture » du formulaire

Dans notre exemple, on choisit un formulaire tout simple pour gérer les clients.

Formulaire Client

Pour configurer le formulaire en fonction des droits utilisateur, on a besoin de mettre sur l'événement « Sur ouverture » du formulaire, un appel à cette procédure :

Événements du formulaire

L’événement Sur ouverture ou Open se produit lorsqu’un formulaire est ouvert, mais avant l’affichage du premier enregistrement. On exécute alors la procédure permettant de paramétrer le formulaire en fonction des autorisations définies dans les tables :

Private Sub Form_Open(Cancel As Integer)
configFormulaire ' paramètre le formulaire en fonction des autorisations accordées à l'utilisateur (ajout, suppression, modification)
End Sub

IX - Précautions supplémentaires à prendre

IX-A - Désactiver la touche MAJ

Si vous appuyez sur la touche MAJ à l'ouverture de l'application, cela va empêcher le chargement du formulaire de démarrage ou l'exécution d'une macro Autoexec à ce moment-là. Cette action permet donc à un utilisateur d'accéder aux objets de la base de données (cf. FAQ).

Pour éviter cette action, on va utiliser le code de la FAQ, pour inhiber la touche MAJ au démarrage.

Il n'est pas nécessaire d'effectuer ce réglage au démarrage de la base de données. Il suffit d'exécuter une fois la procédure SetBypassProperty, et la touche MAJ sera désactivée jusqu'au prochain réglage :

call SetBypassProperty

IX-B - Définir un mot de passe

Vous pouvez également définir un mot de passe pour votre base de données côté serveur, pour éviter qu'un tiers puisse accéder à vos données par un autre moyen. Pour cela, il faut d'abord ouvrir votre fichier Access en mode exclusif  :

1. Sous l’onglet Fichier, cliquez sur Ouvrir :

2. Dans la boîte de dialogue Ouvrir, recherchez le fichier à ouvrir, puis sélectionnez-le ;

3. Cliquez sur la flèche en regard du bouton Ouvrir et cliquez sur Ouvrir en exclusif. La figure suivante illustre le menu :

ouverture en mode exclusif

Puis, définir votre mot de passe depuis le menu Informations :

1. Sous l’onglet Fichier, cliquez sur Informations, puis sur Chiffrer avec mot de passe :

2. La boîte de dialogue « Définir le mot de passe de la base de données » s’affiche :

3. Tapez votre mot de passe dans la zone Mot de passe, retapez-le dans la zone Confirmation, puis cliquez sur OK.

Si maintenant une tierce personne tente d'importer les objets de la base de données, elle est alors contrainte de fournir le mot de passe.

De même, si elle souhaite accéder à la base distante en utilisant du code VBA, elle doit également spécifier le mot de passe dans la chaîne de connexion :

Dim dbs As DAO.Database
Dim strConnexion As String
Dim strCheminBase As String
' Les infos sur la base (chemin et paramètres de connexion)
strCheminBase = "C:....accdb"
strConnexion = "MS Access;pwd=votre_mot_de_passe"
' On ouvre la base de données
Set dbs = OpenDatabase(strCheminBase, False, False, strConnexion)
Debug.Print "Base de données ouverte !"
...

Cependant, elle aurait toujours la possibilité d'importer les objets et notamment les liens présents dans la frontale, et ainsi d'accéder aux données de la base distante. D'où la nécessité de verrouiller également la frontale.

X - Conclusion

Ce système de gestion des droits des utilisateurs n'offre pas les mêmes protections ni les mêmes possibilités que la sécurité Access présente dans les versions antérieures à 2007. Cependant, il peut répondre à l'essentiel des besoins de verrouillage que l'on rencontre chez les utilisateurs de bases de données Access.

XI - Base de données à télécharger

Les fichiers sont au format accdb :

- le fichier de données « gestion-droits-utilisateurs_data.accdb » à copier sur le serveur ;

- la frontale « gestion-droits-utilisateurs.accdb » à copier sur les postes clients.

Exemples d'exécution de procédures stockées avec ADODB pour le paramétrage des formulaires en fonction des droits des utilisateurs :

- le fichier de données « gestion-droits-utilisateurs-adodb_data.accdb » à copier sur le serveur ;

- la frontale « gestion-droits-utilisateurs-adodb.accdb » à copier sur les postes clients.

Bien rétablir les liens au démarrage de l'application en allant chercher le fichier de données côté serveur.

Pour tester l'application, saisir par exemple au démarrage, comme nom d'utilisateur « Dupond » et comme mot de passe « 234 ».

XII - Remerciements

Je tiens à remercier gaby277, Pierre Fauconnier et Laurent Ott de m'avoir conseillé pour la réalisation de cet article, ainsi que Claude Leloup pour sa relecture.