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 multiutilisateurmultiutilisateurs, avec sur le serveur le fichier de données et sur les postes clients l'interface utilisateur :
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 temporaireFormulaire d'authentification.
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 coursmulti-utilisateurs, 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.
III-B. R_Droit_Controle▲
Elle fait le lien entre les tables T_Utilisateur et T_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.
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 :
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.
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 :
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 :
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 temporairevariable 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
- Copie du nom d'utilisateur et du nom du formulaire dans des variables ;
- Ouverture du recordset basé sur la requête R_Droit_Formulaire filtrée avec le nom de l'utilisateur et du formulaire ;
- Paramétrage du formulaire en fonction des autorisations enregistrées dans la table ;
- Ouverture du recordset basé sur la requête R_Droit_Controle filtrée avec le nom de l'utilisateur et du formulaire ;
- Activation ou désactivation des contrôles du formulaire en fonction des autorisations enregistrées dans la table.
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 DAODAO, mais vous pouvez également utiliser ADODB et les procédures stockéesADODB 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.
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 :
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. Fcomment empêcher le lancement du formulaire de démarrage ou de la macro AUTOEXECAQ).
Pour éviter cette action, on va utiliser le code de la FAQ, pour inhiber la touche MAJ au démarrageinhiber 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 :
- Sous l’onglet Fichier, cliquez sur Ouvrir :
- Dans la boîte de dialogue Ouvrir, recherchez le fichier à ouvrir, puis sélectionnez-le ;
- Cliquez sur la flèche en regard du bouton Ouvrir et cliquez sur Ouvrir en exclusif. La figure suivante illustre le menu :
Puis, définir votre mot de passe depuis le menu Informations :
- Sous l’onglet Fichier, cliquez sur Informations, puis sur Chiffrer avec mot de passe :
- La boîte de dialogue « Définir le mot de passe de la base de données » s’affiche :
- 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 fichiersgestion-droits-utilisateurs 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 ADODBgestion-droits-utilisateurs-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.