ACCESS : solution de connexion intégrant la traçabilité et la gestion des utilisateurs

Christophe PIQUER

Ce tutoriel propose une solution d'identification-authentification qui utilise l’identifiant de connexion Windows. Un administrateur de la base gère les droits des utilisateurs et peut consulter les logs de connexion. La solution d’identification est incluse dans la base initiale.

Commentez

- Titre : ACCESS : solution de connexion intégrant la traçabilité et la gestion des utilisateurs

- Auteur : Christophe PIQUER

- Parution : 30 novembre 2022

- Public visé :

- Licence : Copyright ® 2022 Chrispi. 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. Vue générale des objets à créer

- III. Les tables

- III-A. La table T_USERS

- III-B. La table T_GROUPE

- III-C. La table T_LOG

- III-D. La table T_SECU

- IV. La requête de suppression des logs

- V. Les modules de sécurisation

- V-A. Le module de cryptage CRYPTO

- V-B. Le module SHIFTUSE

- VI. Le formulaire de connexion

- VI-A. Composants et propriétés du formulaire

- VI-B. Macros et codes du formulaire

- VI-B-1. Se connecter

- VI-B-2. Première connexion

- VI-B-3. Connexions erronées

- VI-B-4. Annuler la connexion

- VI-B-5. Récupération des logs de connexion

- VII. Le formulaire de l'application

- VII-A. Composants et propriétés du formulaire

- VII-B. Macros et codes du formulaire

- VII-B-1. Ouvrir le formulaire de changement de mot de passe

- VII-B-2. Ouvrir le formulaire de gestion des utilisateurs

- VII-B-3. Quitter l'application

- VIII. Le formulaire de changement de mot de passe

- VIII-A. Composants et propriétés du formulaire

- VIII-B. Macros et codes du formulaire

- VIII-B-1. Chargement conditionnel du formulaire

- VIII-B-2. Valider le nouveau mot de passe

- VIII-B-3. Annuler le changement de mot de passe

- IX. Le formulaire de gestion des utilisateurs

- IX-A. Composants et propriétés du formulaire

- IX-B. Macros et codes du formulaire

- IX-B-1. Ouvrir le formulaire de création d'un nouvel utilisateur

- IX-B-2. Ouvrir le formulaire de modification d'un profil utilisateur

- IX-B-3. Ouvrir le formulaire de suppression d'un utilisateur

- IX-B-4. Voir et exporter la liste des utilisateurs

- IX-B-5. Voir et exporter les logs de connexion

- IX-B-6. Quitter le formulaire de gestion des utilisateurs

- X. Le formulaire de création des nouveaux utilisateurs

- X-A. Composants et propriétés du formulaire

- X-B. Macros et codes du formulaire

- X-B-1. Valider la création d'un nouvel utilisateur

- X-B-2. Attribuer le mot de passe par défaut

- X-B-3. Annuler la création d'un nouvel utilisateur

- X-B-4. Avant de poursuivre

- XI. Le formulaire de modification des utilisateurs

- XI-A. Composants et propriétés du formulaire

- XI-B. Macros et codes du formulaire

- XI-B-1. Tests des modifications des zones de saisie

- XI-B-2. Réinitialiser le mot de passe

- XI-B-3. Valider les modifications du profil utilisateur

- XI-B-4. Annuler les modifications du profil utilisateur

- XI-B-5. Retour au formulaire de gestion des utilisateurs

- XII. Le formulaire de suppression des utilisateurs

- XII-A. Composants et propriétés du formulaire

- XII-B. Macros et codes du formulaire

- XII-B-1. Valider la suppression d'un utilisateur

- XII-B-2. Retour au formulaire de gestion des utilisateurs

- XII-B-3. Annuler la suppression d'un utilisateur

- XIII. Sécuriser l'application

- XIII-A. Masquer les objets, paramétrer l'ouverture et la présentation de l'application

- XIII-A-1. 1er exemple

- XIII-A-2. 2e exemple

- XIII-B. Contrer le contournement du formulaire de connexion

- XIII-C. Chiffrer la base de données

- XIV. Tester le fonctionnement

- XV. Intégrer les fonctions décrites dans ce tutoriel à votre base de données

- XVI. Conclusion

- XVII. Remerciements

I - Introduction

Ce tutoriel destiné initialement à élaborer un formulaire de connexion par mot de passe pour sécuriser ou du moins limiter l’accès à une application de base de données ACCESS, amène à lui associer d'autres formulaires et à rendre l'accès un peu plus sûr. Il vous est proposé de créer une application factice dont vous pourrez réutiliser les codes dans vos propres créations.

Ce tutoriel est inspiré de celui pour Microsoft ACCESS, « Comment concevoir un formulaire login/mot de passe ? » réalisé par Morsi, ainsi que de celui de Denis Hulo, « Créer une gestion des droits des utilisateurs avec ACCESS ».

https://ACCESS.developpez.com/faq/?page=TAAdmin#login

https://denishulo.developpez.com/tutoriels/ACCESS/gestion-droits-utilisateurs/

Comme stipulé dans la publication de Morsi, un formulaire login/mot de passe permet à un utilisateur de s'identifier et à la base de le reconnaître et de décider de lui donner ou non la permission d'accéder aux données.

Donc, ce tutoriel abordera dans un premier temps l'élaboration d'un formulaire de connexion « login/mot de passe » pour accéder à la base de données. Ensuite viendra la conception d'un formulaire permettant aux utilisateurs de changer leur mot de passe. Enfin, pour aller un peu plus loin, sera étudiée celle d'un formulaire de gestion des utilisateurs de l'application. Celui-ci permet à un administrateur de la base d'inscrire ou bien de supprimer des utilisateurs. À cet ensemble de formulaires, sera adjoint l'enregistrement des logs de connexion ou de tentative d'accès. Quelques moyens de sécurisation de la base de données seront aussi abordés.

En mode multiutilisateur, le fichier doit être scindé en deux parties : les données sur le serveur et le reste sur les postes clients.

II - Vue générale des objets à créer

III - Les tables

Voyons maintenant les différentes tables de la base de données.

III-A - La table T_USERS

Cette table permet d'enregistrer les utilisateurs.

Mode Création

Afin que les mots de passe ne soient pas lisibles en clair dans la table, il faut utiliser dans les propriétés du champ PASWD le masque de saisie Mot de passe. Nous verrons plus tard dans ce tutoriel comment crypter les mots de passe dans la table.

III-B - La table T_GROUPE

Cette table permet d'attribuer le statut ou groupe d'appartenance des utilisateurs et donc de définir leurs droits.

Mode Création

Dans la table T_GROUPE, sont enregistrés les statuts des utilisateurs de la base.

Mode Feuille de données

III-C - La table T_LOG

1. Cette table est destinée à stocker les logs de connexion ou de tentative d'accès.

Mode Création

III-D - La table T_SECU

Enfin, cette table donne le statut de la base en termes de sécurité.

Mode Création

Dans la table T_SECU, sont enregistrés les statuts de la sécurité de la base.

Mode Feuille de données

IV - La requête de suppression des logs

Cette requête permet de supprimer automatiquement les logs à une fréquence choisie pour éviter une surcharge de la base et être en accord avec les exigences réglementaires en matière de conservation des logs. Dans ce tutoriel, la fréquence de suppression est fixée à 2 ans. Elle est basée sur la table T_LOG.

Code SQL de la requête (Affichage en mode SQL) :

DELETE DateDiff("yyyy",[DATE_UTILISATION],Date()) AS Expr1
FROM T_LOG
WHERE (((DateDiff("yyyy",[DATE_UTILISATION],Date()))>=2));

Mode Création

V - Les modules de sécurisation

Pour apporter plus de sécurité à l'application, deux modules sont ajoutés à la solution de connexion. Ceux-ci contiennent les fonctions permettant de crypter les mots de passe et d'empêcher de contourner le formulaire de connexion.

V-A - Le module de cryptage CRYPTO

Il contient la fonction de cryptage basée sur l’algorithme publié par jhaoui.com :

https://www.jhaoui.com/2019/09/securiser-et-crypter-mot-de-passe.html

Public Const Cle As String = 2022 'Clé de cryptage des mots de passe
Public Const Mdef As String = "azerty123" 'Mot de passe par défaut
Dim Cryp As String 'Variable à crypter

Public Function Crypter(Mdp As String) As String 'Crypte les mots de passe
Dim Crypto As String
Crypto = ""
For i = Len(Mdp) To 1 Step -1
Crypto = Crypto & Hex(Asc(Mid(Mdp, i, 1)) + Int((Cle / 40)))
Next i
Crypter = Crypto
End Function

Ici sont choisis 2022 comme clé de cryptage et azerty123 comme mot de passe par défaut pour créer un nouvel utilisateur ou réinitialiser un mot de passe. Il est possible de choisir d'autres paramètres, mais aussi de changer le diviseur de la clé, ici 40.

Cryp est la variable associée au mot de passe à crypter dans tous les formulaires.

La fonction Asc renvoie une donnée de type entier qui représente le code ASCII du caractère.

La fonction Mid (chaîne, début, longueur) renvoie une donnée de type Variant (Chaîne) contenant un nombre défini de caractères d’une chaîne.

La fonction Hex renvoie une donnée de type Chaîne qui représente la valeur hexadécimale d’un nombre.

Exemple de cryptage : Développez => AC97A2A2A19E97A811B76

Cette modeste fonction de cryptage nous permettra de faire en sorte que les mots de passe ne soient pas lisibles en clair dans la table T_USERS. Elle sera utilisée dans quasiment tous les formulaires. En effet, elle servira aussi bien pour l'identification-authentification que pour inscrire ou vérifier les mots de passe dans la table T_USERS.

N.B. Le cryptage du mot de passe rend sa saisie sensible à la casse.

V-B - Le module SHIFTUSE

Ce module permet d'autoriser ou non l'utilisation de la touche Shift (Maj).

Comme proposé par Frank :

https://ACCESS.developpez.com/faq/?page=TAAdmin#inhiber

Dans le module implémenté :

- la fonction pour désactiver la touche Shift :

Function ap_DisableShift() 'Désactive la touche Maj au démarrage.
'Les propriétés de démarrage doivent toujours être exécutées.
On Error GoTo errDisableShift
Dim db As Dao.Database
Dim prop As Dao.Property
Const conPropNotFound = 3270
Set db = CurrentDb()
'La ligne suivante désactive la touche Maj au démarrage.
db.Properties("AllowByPassKey") = False
'La fonction est réussie.
Exit Function
errDisableShift:
'La première partie de cette routine d'erreur crée la propriété "AllowByPassKey" si elle n'existe pas.
If Err = conPropNotFound Then
Set prop = db.CreateProperty("AllowByPassKey", _
dbBoolean, False)
db.Properties.Append prop
Resume Next
Else
MsgBox "La fonction ne s'est pas terminée avec succès."
Exit Function
End If
End Function

- la fonction pour activer la touche Shift :

Function ap_EnableShift() 'Active la touche Maj au démarrage.
'Les propriétés de démarrage peuvent être contournée.
On Error GoTo errEnableShift
Dim db As Dao.Database
Dim prop As Dao.Property
Const conPropNotFound = 3270
Set db = CurrentDb()
'La ligne de code suivante active la touche Maj au démarrage.
db.Properties("AllowByPassKey") = True 'La fonction est réussie.
Exit Function
errEnableShift:
'La première partie de cette routine d'erreur crée la propriété "AllowByPassKey" si elle n'existe pas.
If Err = conPropNotFound Then
Set prop = db.CreateProperty("AllowByPassKey", _
dbBoolean, True)
db.Properties.Append prop
Resume Next
Else
MsgBox "La fonction ne s'est pas terminée avec succès."
Exit Function
End If
End Function

VI - Le formulaire de connexion

Comme stipulé en introduction, le formulaire F_CONNEXION permet à un utilisateur d'accéder à la base de données à l'aide de son identifiant et de son mot de passe.

Mode création

Mode formulaire

VI-A - Composants et propriétés du formulaire

Composant

Onglet

Propriétés

Formulaire

Format

Légende : Connexion
Affichage par défaut : Formulaire unique
Autoriser le mode formulaire : Oui
Autoriser le mode feuille de données : Non
Autoriser le mode page : Non
Afficher sélecteur : Non
Bouton de déplacement : Non
Zone contrôle : Non
Bouton fermer : Non
Bouton MinMax : Aucun
Déplaçable : Non

Données

Source : T_LOG
Entrée de données : Oui

Événement

Sur chargement : [Procédure événementielle]
Sur touche appuyée : [Procédure événementielle]
Sur ouverture : [Procédure événementielle]
Aperçu des touches : Oui

Autres

Fenêtre contextuelle : Oui
Fenêtre modale : Oui

Zone de texte : Identifiant

Données

Verrouillé : Oui

Autres

Nom : txt_user

Zone de texte: Mot de passe

Données

Masque de saisie : Mot de passe

Autres

Nom : txt_pass

Zone de texte : Connex

Format

Visible : Non

Données

Source contrôle : CONNEXION

Autres

Nom : Acconnex

Bouton : Annuler

Événement

Sur clic : [Procédure événementielle]

Autres

Nom : Annulcon

Bouton : Entrer

Événement

Sur clic : [Procédure événementielle]

Autres

Nom : Connex

VI-B - Macros et codes du formulaire

Sont décrites ici les procédures qui permettent à un utilisateur de se connecter à la base de données, mais aussi celles qui sont utilisées lors d'une première connexion et lors de tentatives de connexion erronées ou annulées ainsi que celles qui permettent l'enregistrement des logs de connexion dans la table T_LOG.

VI-B-1 - Se connecter

Pour se connecter, un clic sur le bouton Entrer lance la requête qui permet de vérifier si l'identifiant et le mot de passe saisis sont présents dans la table T_USERS.
À la troisième tentative de connexion erronée, l'application se ferme ainsi qu'ACCESS.

Pour une première connexion, l'option prise est que l'administrateur donne aux nouveaux utilisateurs le mot de passe azerty123.

Pour que l'identification fonctionne, il est nécessaire de récupérer l'identifiant de session Windows de l'utilisateur. Cela se fait à l'ouverture du formulaire de connexion au niveau de la zone texte de l'identifiant.

Private Sub Form_Open(Cancel As Integer) 'Récupération identifiant de session Windows de l'utilisateur
Me.txt_user = Environ$("username")
End Sub

Procédure de connexion appelée par le bouton Entrer :

Private Sub Connect() 'Procédure de connexion suivant les critères de validation de la connexion
Dim SQL As String
Dim rs As DAO.Recordset
Static i As Byte
If Len(Me.txt_pass.Value & vbNullString) = 0 Then 'Test complétude zone de texte du mot de passe
MsgBox "Merci de saisir votre mot de passe pour vous connecter.", vbExclamation, "Connexion"
Else
'Crypte le mot de passe
Cryp = Crypter(Me.txt_pass.Value)
'Création de variables temporaires
Application.TempVars.Add "Identuser", Me.txt_user.Value
Application.TempVars.Add "Mdpuser", Crypter(Me.txt_pass.Value)
End If
'Connexion suivant login/mot de passe
SQL = "SELECT GROUPE FROM T_USERS WHERE TRIGRAMME = """ & Me.txt_user & """ AND PASWD = """ & Cryp & """;"
Set rs = CurrentDb.OpenRecordset(SQL)
If Not rs.EOF Then
DoCmd.GoToRecord , , acLast  'Aller au dernier enregistrement du formulaire
Me.Acconnex = "Ok" 'Récupération info de connexion réussie
Me.[CONNEXION] = Me.Acconnex 'Inscription du statut de connexion dans T_LOG
DoCmd.OpenForm "F_APPLICATION", acNormal, , , , acWindowNormal
If Me.txt_pass = Mdef Then 'Repérage mot de passe de première connexion
MsgBox "Première connexion. Vous devez changer de mot de passe.", vbInformation, "Changement mot de passe"
'Ouverture du formulaire de changement de mot de passe selon l'identifiant et le mot de passe de l'utilisateur
DoCmd.OpenForm "F_CHGTMDP", , , "[TRIGRAMME] = """ & Me.txt_user & """ and [PASWD] = """ & Cryp & """"
End If
DoCmd.Close acForm, "F_CONNEXION"
Else
'Réponses aux tentatives de connexion erronées
i = i + 1
Select Case i
Case 1
MsgBox "Première Tentative - Attention ! Identifiant et/ou Mot de Passe incorrect(s). À la troisième tentative erronée, fermeture de l'application.", vbExclamation, "Connexion"
Case 2
MsgBox "Deuxième Tentative - Attention ! Identifiant et/ou Mot de Passe incorrect(s). À la troisième tentative erronée, fermeture de l'application.", vbExclamation, "Connexion"
Case 3
DoCmd.GoToRecord , , acLast 'Aller au dernier enregistrement du formulaire
Me.Acconnex = "Echec" 'Récupération info d'échec de connexion
Me.[CONNEXION] = Me.Acconnex 'Inscription du statut de connexion dans T_LOG
MsgBox "Troisième Tentative - Fermeture de l'application. Vous avez dépassé le nombre de tentatives autorisées.", vbCritical, "Connexion"
DoCmd.Quit
End Select
End If
'Libération de la variable objet
rs.Close
Set rs = Nothing
End Sub

Code associé au bouton Entrer :

Private Sub Connex_Click() 'Appel de la procédure de connexion
Connect
End Sub

Quand la connexion est réussie, la procédure de validation permet d'enregistrer le mot Ok dans la table T_LOG.

Lors de la connexion ont été créées les variables temporaires Identuser (l'identifiant) et Mdpuser (le mot de passe crypté) qui servent ensuite notamment pour le changement de mot de passe et pour gérer les droits d'administrateur de la base.

Très souvent, plutôt que de cliquer sur le bouton Entrer après la saisie de ses identifiants, l'utilisateur appuie naturellement sur la touche Entrée de son clavier pour se connecter à la base de données. Aussi, pour lui offrir cette possibilité, est ajoutée une procédure qui est appelée sur l'événement Sur touche appuyée du formulaire.

Private Sub Entr() 'Procédure de connexion avec la touche Entrée
Connex.SetFocus
Connex_Click
End Sub

Appel de la procédure de connexion lors de l'utilisation de la touche Entrée :

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 'Connexion avec la touche Entrée
If KeyCode = vbKeyReturn Then
Entr
End If
End Sub

Pour pouvoir utiliser la touche Entrée, il faut qu'au niveau de l'onglet Événement des propriétés du formulaire, Aperçu des touches soit à Oui.

VI-B-2 - Première connexion

Lorsqu'un nouvel utilisateur se connecte avec le mot de passe de première connexion azerty123, il est prévenu qu'il doit changer de mot de passe.

Quand le nouvel utilisateur clique sur OK, il est envoyé préalablement sur le formulaire de changement de mot de passe avant d'accéder à F_APPLICATION.

VI-B-3 - Connexions erronées

Lors des connexions erronées, un message apparaît informant l'utilisateur de la non-validité de son authentification et du nombre de tentatives.

À la troisième tentative de connexion non valide, après fermeture du message, F_CONNEXION se ferme et l'utilisateur quitte ACCESS. Echec est alors enregistré dans la table T_LOG.

Si l'utilisateur n'a saisi aucun mot de passe et qu'il tente de se connecter, un message s'affiche et une tentative de connexion erronée est aussi prise en compte.

VI-B-4 - Annuler la connexion

Le bouton Annuler permet à l'utilisateur de quitter le formulaire de connexion et par là même ACCESS. L'information d'annulation de la connexion, Annulé, est récupérée pour être enregistrée dans T_LOG.

Code associé au bouton Annuler :

Private Sub Annulcon_Click() 'Annulation connexion
Me.Acconnex = "Annulé" 'Récupération de l'info d'annulation
DoCmd.Quit
End Sub

VI-B-5 - Récupération des logs de connexion

Les informations d'annulation, d'échec ou de réussite de connexion étant récupérées lors des clics sur les boutons Annuler et Connexion, afin d'enregistrer les connexions et les tentatives de connexion à l'application dans la table T_LOG, il est nécessaire de récupérer le nom du PC, l'adresse IP, l'identifiant de l'utilisateur et l'horodatage.

Préalablement, il faut une fonction spécifique pour obtenir l'adresse IP du PC.

Public Function getMyIP() 'Fontion récupération de l'adresse IP
Dim myWMI As Object, myObj As Object, Itm
Set myWMI = GetObject("winmgmts:\\.\root\cimv2")
Set myObj = myWMI.ExecQuery("SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
For Each Itm In myObj
getMyIP = Itm.IPAddress(0)
Exit Function
Next
End Function

Puis, les paramètres cités plus haut sont copiés au chargement du formulaire dans les zones de texte correspondantes, pour ensuite les enregistrer dans la table T_LOG.

Private Sub Form_Load() 'Alimentation table des logs de connexion
'Récupération des éléments et inscription dans T_LOG
Me.[UTILISATEUR] = Me.txt_user 'Identifiant
Me.[ORDINATEUR] = Environ$("ComputerName") 'PC
Me.[DATE_UTILISATION] = Now() 'Date
Me.[ADRESSE_IP] = getMyIP 'Adresse IP
End Sub

VII - Le formulaire de l'application

L'objectif étant surtout de décrire le principe de fonctionnement des formulaires de connexion et de gestion des droits des utilisateurs, la base jointe ne sert que de support pour ouvrir les formulaires de changement de mot de passe et de gestion des utilisateurs.

Pour sécuriser l'accès et gérer les droits des utilisateurs dans votre application, il faudra ajouter les composants de F_APPLICATION à votre formulaire d'accueil et modifier le code en conséquence.

Mode création

Mode formulaire

VII-A - Composants et propriétés du formulaire

Composant

Onglet

Propriétés

Formulaire

Format

Légende : Application
Affichage par défaut : Formulaire unique
Autoriser le mode formulaire : Oui
Autoriser le mode feuille de données : Non
Autoriser le mode page : Non
Afficher sélecteur : Non
Bouton de déplacement : Non
Zone contrôle : Oui
Bouton fermer : Oui
Bouton MinMax : Les deux activés
Déplaçable : Oui

Événement

Sur chargement : [Procédure événementielle]
Sur ouverture : [Procédure événementielle]
Sur fermeture : [Macro incorporée]

Autres

Fenêtre contextuelle : Oui
Fenêtre modale : Oui

Zone de texte : Ident

Format

Visible : Non

Autres

Nom : Identuser

Zone de texte : Mdp

Format

Visible : Non

Autres

Nom : Mdpuser

Étiquette : Changer mot de passe

Format

Légende : Changer mot de passe
Souligné : Oui
Couleur texte : Accent 5

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Chgtmdp

Étiquette : Gestion utilisateurs

Format

Légende : Gestion utilisateurs
Visible : Non
Souligné : Oui
Couleur texte : #C0504D

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Gestutil

Bouton : Quitter

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Quit

VII-B - Macros et codes du formulaire

La suppression des données de connexion arrivées à échéance est réalisée au chargement du formulaire, en lançant la requête R_SUPLOG.

Private Sub Form_Load() 'Lancement requête de suppression des logs
CurrentDb.Execute "R_SUPLOG", dbFailOnError
End Sub

Pour pouvoir ouvrir les formulaires de changement de mot de passe et de gestion des utilisateurs, il est nécessaire de récupérer l'identifiant et le mot de passe de l'utilisateur.
C'est donc à ce niveau que le statut de l'utilisateur est vérifié pour déterminer si c'est un administrateur ou un simple utilisateur. Pour cela, à l'ouverture du formulaire F_APPLICATION, est récupéré le contenu des variables temporaires créées lors de la connexion. Si l'utilisateur est un administrateur, Gestion utilisateurs est alors visible.

La procédure suivante est appelée lors de l'ouverture du formulaire.

Private Sub Discr() 'Procédure de discrimination des possibilités d'accès utilisateur-administrateur
Dim SQL As String
Dim rs As DAO.Recordset
'Récupération des variables temporaires identifiant et mot de passe
Me.Identuser = Application.TempVars("Identuser").Value
Me.Mdpuser = Application.TempVars("Mdpuser").Value
'Gestion des utilisateurs ACCESSible si c'est un administrateur
SQL = "SELECT * FROM T_USERS WHERE TRIGRAMME = """ & Me.Identuser & """ AND PASWD = """ & Me.Mdpuser & """ AND GROUPE = 'Administrateur';"
Set rs = CurrentDb.OpenRecordset(SQL)
If Not rs.EOF Then
Me!Gestutil.Visible = True 'Gestion des utilisateurs accessibles
End If
'Libération de la variable objet
rs.Close
Set rs = Nothing
End Sub

Appel de la procédure à l'ouverture du formulaire :

Private Sub Form_Open(Cancel As Integer)
Discr
End Sub

VII-B-1 - Ouvrir le formulaire de changement de mot de passe

Un clic sur l'étiquette Changement mot de passe ouvre le formulaire de changement de mot de passe.

Private Sub Chgtmdp_Click() 'Ouverture du formulaire de changement de mot de passe selon l'identifiant et le mot de passe de l'utilisateur
DoCmd.OpenForm "F_CHGTMDP", , , "[TRIGRAMME] = """ & Me.Identuser & """ and [PASWD] = """ & Me.Mdpuser & """"
End Sub

VII-B-2 - Ouvrir le formulaire de gestion des utilisateurs

Un clic sur l'étiquette Gestion utilisateurs ouvre le formulaire de gestion des utilisateurs. L'ouverture de ce formulaire est conditionnelle. Pour pouvoir y accéder, l'utilisateur doit faire partie du groupe Administrateur, sinon cette étiquette n'est pas visible.

Macro associée à l'étiquette Gestion utilisateurs

VII-B-3 - Quitter l'application

Un clic sur le bouton Quitter provoque la fermeture de F_APPLICATION et d'ACCESS.

Macro associée au bouton Quitter

À la fermeture du formulaire par la croix X, l'utilisateur quitte aussi ACCESS.

Macro associée à la fermeture du formulaire

VIII - Le formulaire de changement de mot de passe

F_CHGTMDP permet à un utilisateur de changer son mot de passe, notamment et obligatoirement lors d'une première connexion.

Mode création

Mode formulaire

VIII-A - Composants et propriétés du formulaire

Composant

Onglet

Propriétés

Formulaire

Format

Légende : Changement mot de passe
Affichage par défaut : Formulaire unique
Autoriser le mode formulaire : Oui
Autoriser le mode feuille de données : Non
Autoriser le mode page : Non
Afficher sélecteur : Non
Bouton de déplacement : Non
Zone contrôle : Non
Bouton fermer : Non
Bouton MinMax : Aucun
Déplaçable : Non

Données

Source : T_USERS

Événement

Sur chargement : [Procédure événementielle]
Sur touche appuyée : [Procédure événementielle]
Sur ouverture : [Procédure événementielle]
Aperçu des touches : Oui

Autres

Fenêtre contextuelle : Oui
Fenêtre modale : Oui

Zone de texte : Ident

Format

Visible : Non

Données

Source contrôle : TRIGRAMME

Autres

Nom : Chgtident

Zone de texte : Identifiant

Données

Verrouillé : Oui

Autres

Nom : Identchgt

Zone de texte : Mdp

Format

Visible : Non

Données

Source contrôle : PASWD

Autres

Nom : Chgtmdp

Zone de texte: Mot de passe

Données

Masque de saisie : Mot de passe

Autres

Nom : Mdpchgt

Zone de texte : Confirmation mot de passe

Données

Masque de saisie : Mot de passe

Autres

Nom : Mdpconf

Bouton : Annuler

Événement

Sur clic : [Macro incorporée]

Autres

Bouton : Valider

Événement

Sur clic : [Procédure événementielle]

Autres

Nom : Validchgt

VIII-B - Macros et codes du formulaire

Pour procéder au changement de mot de passe, il est nécessaire d'avoir l'identifiant et le mot de passe de l'utilisateur. Cela se fait à l'ouverture du formulaire F_CHGTMDP en récupérant les variables temporaires d'identification qui ont été créées lors de la connexion de l'utilisateur.

Private Sub Form_Open(Cancel As Integer) 'Récupération des variables temporaires identifiant et mot de passe
Me.Identchgt = Application.TempVars("Identuser").Value
Me.Mdpchgt = Application.TempVars("Mdpuser").Value
End Sub

VIII-B-1 - Chargement conditionnel du formulaire

Au chargement de F_CHGTMDP, si le mot de passe utilisé est azerty123 (celui d'une première connexion), le bouton Annuler est alors invisible de façon à rendre la fermeture du formulaire impossible pour obliger l'utilisateur à changer son mot de passe tout en l'informant préalablement des modalités de composition de son nouveau mot de passe.

Procédure qui sera appelée au chargement du formulaire :

Private Sub Charginfo() 'Procédure de chargement conditionnel du formulaire et information
Dim Rep As Integer
Cryp = Crypter(Mdef) 'Le mot de passe par défaut(azerty123)est crypté
If Mdpchgt = Cryp Then
Annulchgt.Visible = False 'Le bouton Annuler est invisible
End If
Rep = MsgBox("Le mot de passe doit être composé d'au moins 9 caractères.", vbInformation, "Changement mot de passe")
If Rep = vbOK Then 'Effacement zone de texte du mot de passe pour une nouvelle saisie
Me.Mdpchgt = ""
End If
End Sub

Appel de la procédure au chargement du formulaire :

Private Sub Form_Load() 'Chargement conditionnel du formulaire et information
Charginfo
End Sub

Au chargement de F_CHGTMDP, l'utilisateur est informé de la composition minimale du mot de passe (dans ce tutoriel : 9 caractères).

Quand l'utilisateur clique sur le bouton OK du message, la zone de texte du mot de passe est effacée afin d'attendre la saisie du nouveau mot de passe.

VIII-B-2 - Valider le nouveau mot de passe

Le bouton Valider lance la procédure de changement de mot de passe. Celle-ci passe par un ensemble de contrôles. Il faut qu'il y ait obligatoirement un mot de passe saisi dans la zone de texte Mot de passe. Celui-ci doit être composé au minimum de 9 caractères. Il doit être identique à celui saisi dans la zone de texte Confirmation. De plus, le mot de passe ne doit pas être le même que celui utilisé pour un autre profil de l'utilisateur. Donc, à ce niveau, il doit être crypté pour être comparé à celui déjà présent dans la table T_USERS. Enfin, si le mot de passe répond à tous les critères, son changement pourra être validé et inscrit crypté dans cette table.

Procédure de validation qui sera appelée par le bouton Valider :

Private Sub Valnmdp() 'Procédure changement mot de passe
Dim SQL As String
Dim rs As DAO.Recordset
Select Case True 'Test des conditions de validité du mot de passe
'Test longueur du mot de passe
Case Len(Me.Mdpchgt.Value & vbNullString) = 0 Or Len(Me.Mdpchgt) < 9
MsgBox "Attention ! Le mot de passe doit être composé d'au moins 9 caractères.", vbExclamation, "Changement mot de passe"
'Test présence de la confirmation
Case Len(Me.Mdpconf.Value & vbNullString) = 0
MsgBox "Attention ! Merci de confirmer votre mot de passe.", vbExclamation, "Changement mot de passe"
'Test confirmation du mot de passe
Case Me.Mdpconf <> Me.Mdpchgt
MsgBox "Attention ! Confirmation différente du mot de passe.", vbExclamation, "Changement mot de passe"
'Test non-réutilisation du mot de passe de première connexion
Case Else
'Crypte le mot de passe
Cryp = Crypter(Me.Mdpchgt.Value)
'Test non-réutilisation du mot de passe par défaut
If Me.Mdpchgt.Value = Mdef Then
MsgBox "Attention ! Mot de passe non autorisé. Merci de le changer.", vbExclamation, "Changement mot de passe"
Else
'Test non-utilisation du mot de passe de l'utilisateur pour un autre de ses profils
SQL = "SELECT PASWD FROM T_USERS WHERE TRIGRAMME = """ & Me.Identchgt & """ AND PASWD = """ & Cryp & """;"
Set rs = CurrentDb.OpenRecordset(SQL)
If Not rs.EOF Then
MsgBox "Attention ! Mot de passe déjà utilisé dans un autre de vos profils. Veuillez en utiliser un autre.", vbExclamation, "Changement mot de passe"
Else
'Validation changement mot de passe
Me.Chgtident.Value = Me.Identchgt.Value
Me.Chgtmdp.Value = Cryp
Form_F_APPLICATION.Mdpuser = Me.Chgtmdp
MsgBox "Changement de mot de passe réussi.", vbInformation, "Changement mot de passe"
DoCmd.Close acForm, "F_CHGTMDP"
End If
'Libération de la variable objet
rs.Close
Set rs = Nothing
End If
End Select
End Sub

Code associé au bouton Valider :

Private Sub Validchgt_Click() 'Changement mot de passe
Valnmdp
End Sub

Lors du clic sur le bouton Valider, un ensemble de tests est réalisé avant la validation.

Si la zone de texte Mot de passe est vide ou la saisie inférieure à 9 caractères, l'utilisateur en est informé par un message.

S'il n'y a pas de confirmation du mot de passe, l'utilisateur en est informé par un message.

Si le mot de passe et la confirmation sont différents, l'utilisateur en est informé par un message.

Si le mot de passe est déjà utilisé dans l’un de ses profils, l'utilisateur en est informé par un message.

Si l'utilisateur essaie de réutiliser le mot de passe de première connexion azerty123, un message lui demande d'en changer.

Quand le changement de mot de passe est validé, l'utilisateur en est informé par un message.

À la fermeture du message de réussite du changement de mot de passe, F_CHGTMDP est fermé et l'utilisateur revient sur F_APPLICATION.

Ici aussi, l'utilisateur peut valider son nouveau mot de passe en utilisant la touche Entrée après avoir saisi la confirmation.

Dans l'onglet Événement des propriétés du formulaire, la procédure qui sera appelée par Sur touche appuyée.

Private Sub Entr() 'Procédure de validation avec la touche Entrée
Validchgt.SetFocus
Validchgt_Click
End Sub

Appel de la procédure de changement et validation du mot de passe lors de l'utilisation de la touche Entrée.

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 'Validation du changement avec la touche Entrée
If KeyCode = vbKeyReturn Then
Entr
End If
End Sub

Pour pouvoir utiliser la touche Entrée, il faut qu'au niveau de l'onglet Événement des propriétés du formulaire, Aperçu des touches soit à Oui.

VIII-B-3 - Annuler le changement de mot de passe

Le bouton Annuler permet à l'utilisateur de quitter le formulaire sans changer de mot de passe et revenir sur F_APPLICATION.

Macro associée au bouton Annuler

Le bouton Annuler est invisible lors de la demande de changement de mot de passe suite à une première connexion avec le mot de passe par défaut azerty123.

IX - Le formulaire de gestion des utilisateurs

Le formulaire de gestion des utilisateurs F_GESTUTIL est celui qui permet à un administrateur :

- l'ouverture du formulaire de modification des profils des utilisateurs ;

- l'ouverture du formulaire de création des nouveaux utilisateurs ;

- l'ouverture du formulaire de suppression d'utilisateurs ;

- la visualisation d’un état des utilisateurs et de l'exporter au format .txt ;

- la visualisation d’un état des logs de connexion et de l'exporter au format .log.

Il n'est pas possible de créer, de modifier ou de supprimer directement le profil d'un utilisateur depuis le formulaire F_GESTUTIL.

Mode création

Mode formulaire

IX-A - Composants et propriétés du formulaire

Composant

Onglet

Propriétés

Formulaire

Format

Légende : Gestion des utilisateurs
Affichage par défaut : Formulaire unique
Autoriser le mode formulaire : Oui
Autoriser le mode feuille de données : Non
Autoriser le mode page : Non
Afficher sélecteur : Non
Bouton de déplacement : Oui
Zone contrôle : Non
Bouton fermer : Non
Bouton MinMax : Aucun
Déplaçable : Non

Données

Source : T_USERS

Autres

Fenêtre contextuelle : Oui
Fenêtre modale : Oui

Zone de texte: ID

Format

Visible : Non

Données

Source contrôle : ID

Autres

Nom : IDgest

Zone de texte: Identifiant

Données

Source contrôle : TRIGRAMME
Verrouillé : Oui

Autres

Nom : Identgest

Zone de texte: Nom

Données

Source contrôle : NOM
Verrouillé : Oui

Autres

Nom : Nomgest

Zone de texte: Prénom

Données

Source contrôle : PRENOM
Verrouillé : Oui

Autres

Nom : Pregest

Zone de texte: Groupe

Données

Source contrôle : GROUPE
Verrouillé : Oui

Autres

Nom : Gpegest

Zone de texte: Mot de passe

Format

Visible : Non

Données

Source contrôle : PASWD

Autres

Nom : Mdpgest

Bouton : Voir utilisateurs

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Voirutil

Bouton : Voir logs

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Voirlog

Bouton : Exporter utilisateurs

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Exputil

Bouton : Exporter logs

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Explog

Bouton : Nouveau

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Nouvgestu

Bouton : Modifier

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Modifgestu

Bouton : Supprimer

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Supgestu

Bouton : Quitter

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Quitgestu

Zone de liste déroulante : Sécurité base

Données

Contenu : SELECT T_SECU.SECURITE FROM T_SECU;
Valeur par défaut : « Activée »

Événement

Sur perte focus : [Procédure événementielle]
Sur touche appuyée : [Procédure événementielle]

Autres

Nom : Secubase

IX-B - Macros et codes du formulaire

À partir d'ici sont abordés les macros et codes qui permettent à un administrateur d'ouvrir les formulaires de création, de modification ou de suppression des comptes des utilisateurs. Il lui est aussi donné l'accès aux états des utilisateurs et des logs ainsi que la possibilité de générer et d'exporter un fichier de chacun des états.

IX-B-1 - Ouvrir le formulaire de création d'un nouvel utilisateur

Le bouton Nouveau permet d'ouvrir le formulaire de création d'un utilisateur F_GESTNOUV.

Macro associée au bouton Nouveau

IX-B-2 - Ouvrir le formulaire de modification d'un profil utilisateur

Le bouton Modifier permet d'ouvrir le formulaire de modification F_GESTMOD après avoir sélectionné un enregistrement avec le sélecteur en bas du formulaire. L'ouverture du formulaire est conditionnée par la sélection effective d'un utilisateur présent dans T_USERS et non celle d'un enregistrement vide réalisée en poussant le sélecteur comme pour générer un nouvel enregistrement. D'où la nécessité de vérifier la complétude de la zone de texte ID.

Macro associée au bouton Modifier

Si l'administrateur vient à sélectionner un enregistrement vide, il est invité par un message à choisir un enregistrement valide et sera repositionné au premier enregistrement du formulaire.

IX-B-3 - Ouvrir le formulaire de suppression d'un utilisateur

Si l'administrateur veut supprimer un utilisateur, il le sélectionne et clique sur le bouton Supprimer qui permet d'ouvrir le formulaire de suppression F_GESTSUP. L'ouverture du formulaire est conditionnée, comme pour celui de la modification, par la sélection effective d'un utilisateur présent dans la table T_USERS.

Macro associée au bouton Supprimer

Si l'administrateur vient à sélectionner un enregistrement vide, il est invité par un message à choisir un enregistrement valide et sera repositionné au premier enregistrement du formulaire.

IX-B-4 - Voir et exporter la liste des utilisateurs

Pour voir la liste des utilisateurs, il faut cliquer sur le bouton Voir utilisateurs. Mais pour cela, il faut un état, ici nommé E_USERS. Le masque de saisie Mot de passe est appliqué sur la colonne des mots de passe.

Mode création

Mode état

Macro associée au bouton Voir utilisateurs

Pour générer un fichier texte de la liste des utilisateurs, l'administrateur doit cliquer sur le bouton Exporter utilisateurs. À la création de la macro, la table T_USERS est choisie et le chemin d'exportation et de création du fichier Fichutil.txt est défini.

Macro associée au bouton Exporter utilisateurs

Quand l'administrateur demande l'export du fichier, si Fichutil.txt existe déjà, un message l'informe et lui demande s'il veut le remplacer.

Si l'administrateur clique sur Non, il est en mesure d'annuler l'enregistrement, mais il peut aussi enregistrer le fichier sous un autre nom ou l'enregistrer dans un autre répertoire.

Image du fichier Fichutil.txt

IX-B-5 - Voir et exporter les logs de connexion

En cliquant sur le bouton Voir logs on peut voir les logs de connexion. Pour cela, il faut un état, ici E_LOG.

Mode création

Mode état

Macro associée au bouton Voir logs

Pour générer un fichier texte des logs, l'administrateur doit cliquer sur le bouton Exporter logs. À la création de la macro, la table T_LOG est sélectionnée et le chemin d'exportation et de création du fichier Fichlog.log est défini.

Macro associée au bouton Exporter logs

Quand l'administrateur demande l'export du fichier, si Fichlog.log existe déjà, un message l'informe et lui demande s'il veut le remplacer.

Si l'administrateur clique sur Non, il est en mesure d'annuler l'enregistrement, mais il peut aussi enregistrer le fichier sous un autre nom ou l'enregistrer dans un autre répertoire.

Image du fichier Fichlog.log

IX-B-6 - Quitter le formulaire de gestion des utilisateurs

Pour quitter le formulaire de gestion des utilisateurs, l'administrateur doit cliquer sur le bouton Quitter.

Macro associée au bouton Quitter

L'utilisation de la zone de liste déroulante Sécurité base sera abordée dans le chapitre consacré à la sécurisation de la base de données.

X - Le formulaire de création des nouveaux utilisateurs

Le formulaire F_GESTNOUV est destiné à l'inscription des nouveaux utilisateurs dans la table T_USERS. Il est appelé depuis le formulaire de gestion des utilisateurs F_GESTUTIL en cliquant sur le bouton Nouveau.

Mode création

Mode formulaire

X-A - Composants et propriétés du formulaire

Composant

Onglet

Propriétés

Formulaire

Format

Légende : Gestion des utilisateurs - Création
Affichage par défaut : Formulaire unique
Autoriser le mode formulaire : Oui
Autoriser le mode feuille de données : Non
Autoriser le mode page : Non
Afficher sélecteur : Non
Bouton de déplacement : Non
Zone contrôle : Non
Bouton fermer : Non
Bouton MinMax : Aucun
Déplaçable : Non

Événement

Sur chargement : [Macro incorporée]
Sur touche appuyée : [Procédure événementielle]
Aperçu des touches : Oui

Autres

Fenêtre contextuelle : Oui
Fenêtre modale : Oui

Zone de texte : Identifiant

Autres

Nom : Identnouv

Zone de texte : Nom

Autres

Nom : Nomnouv

Zone de texte : Prénom

Autres

Nom : Prenouv

Zone de liste déroulante : Groupe

Données

Contenu : SELECT T_GROUPE.GROUPE FROM T_GROUPE;
Limiter à liste : Oui
Autoriser les modifications de la liste des valeurs : Non
Hériter la liste des valeurs : Oui
Afficher uniquement les valeurs de la source : Oui
Valeur par défaut : « Utilisateur »

Événement

Sur touche appuyée : [Procédure événementielle]

Autres

Nom : Gpenouv

Zone de texte : Mot de passe

Données

Masque de saisie : Mot de passe

Autres

Nom : Mdpnouv

Bouton : Mot de passe par défaut

Événement

Sur clic : [Procédure événementielle]

Autres

Nom : Mdpdef

Bouton : Annuler

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Annulnouv

Bouton : Créer

Événement

Sur clic : [Procédure événementielle]

Autres

Nom : Creanouv

X-B - Macros et codes du formulaire

Au chargement de F_GESTNOUV, le formulaire de gestion des utilisateurs F_GESTUTIL est fermé.

Macro associée au chargement de F_GESTNOUV

Afin d'interdire toute saisie clavier dans la liste déroulante du groupe d'appartenance de l'utilisateur, le code suivant est appliqué au niveau de Sur touche appuyée de l'onglet Événement des propriétés de la zone de liste déroulante Gpenouv.

Private Sub Gpenouv_KeyDown(KeyCode As Integer, Shift As Integer) 'Interdiction saisie clavier dans la zone de liste déroulante
If KeyCode <> 9 Then  'Si touche appuyée <> de Tab
KeyCode = 0 'Interdit la saisie au clavier
End If
End Sub

X-B-1 - Valider la création d'un nouvel utilisateur

Avant validation de la création d'un nouvel utilisateur, chaque zone de saisie est soumise à un test de vérification de son contenu. Pour un bon fonctionnement, l'utilisateur ne doit posséder au plus qu'un seul compte administrateur et qu'un seul compte de simple utilisateur avec des mots de passe différents.

Procédure de réalisation des tests et de validation de la création d'un nouvel utilisateur :

Private Sub Creat() 'Procédure de création d'un utilisateur
Dim SQL1 As String
Dim SQL2 As String
Dim SQL3 As String
Dim rs As DAO.Recordset
Dim rst As DAO.Recordset
Select Case True
'Test présence de l'identifiant
Case Len(Me.Identnouv.Value & vbNullString) = 0
MsgBox "Attention ! Identifiant requis.", vbExclamation, "Création utilisateurs"
'Test présence du nom
Case Len(Me.Nomnouv.Value & vbNullString) = 0
MsgBox "Attention ! Nom requis.", vbExclamation, "Création utilisateurs"
'Test présence du prénom
Case Len(Me.Prenouv.Value & vbNullString) = 0
MsgBox "Attention ! Prénom requis.", vbExclamation, "Création utilisateurs"
'Test présence et longueur du mot de passe
Case Len(Me.Mdpnouv.Value & vbNullString) = 0 Or Len(Me.Mdpnouv) < 9
MsgBox "Attention ! Le mot de passe doit être composé d'au moins 9 caractères.", vbExclamation, "Création utilisateurs"
Case Else
'Test non-présence de l'utilisateur dans le groupe sélectionné
SQL1 = "SELECT GROUPE FROM T_USERS WHERE TRIGRAMME = """ & Me.Identnouv & """ AND GROUPE = '" & Me.Gpenouv & "';"
Set rs = CurrentDb.OpenRecordset(SQL1)
If Not rs.EOF Then
MsgBox "Attention ! Utilisateur déjà présent dans ce groupe.", vbExclamation, "Création utilisateurs"
Else
'Crypte le mot de passe
Cryp = Crypter(Mdpnouv.Value)
'Test non-utilisation du mot de passe pour un autre profil de l'utilisateur
SQL2 = "SELECT PASWD FROM T_USERS WHERE TRIGRAMME = """ & Me.Identnouv & """ AND PASWD = '" & Cryp & "';"
Set rst = CurrentDb.OpenRecordset(SQL2)
If Not rst.EOF Then
MsgBox "Attention ! Mot de passe déjà utilisé dans un autre profil de cet utilisateur. Veuillez en utiliser un autre.", vbExclamation, "Création utilisateurs"
Else
'Validation création après confirmation du statut et du mot de passe de l'utilisateur
SQL3 = "INSERT INTO T_USERS (TRIGRAMME,NOM_UTIL,PRENOM,GROUPE,PASWD) VALUES (""" & Me.Identnouv & """,""" & Me.Nomnouv & """,""" & Me.Prenouv & """,""" & Me.Gpenouv & """, '" & Cryp & "');"
CurrentDb.Execute SQL3, dbFailOnError
MsgBox "Création utilisateur réussie.", vbInformation, "Création utilisateurs"
DoCmd.OpenForm "F_GESTUTIL", acNormal, , , , acWindowNormal
DoCmd.Close acForm, "F_GESTNOUV"
End If
'Libération de la variable objet
rst.Close
Set rst = Nothing
End If
'Libération de la variable objet
rs.Close
Set rs = Nothing
End Select
End Sub

En cliquant sur le bouton Valider, la procédure est appelée et les opérations de vérification sont ainsi lancées. Si toutes répondent favorablement, le nouvel utilisateur est créé.

Code associé au bouton Valider :

Private Sub Creanouv_Click() 'Création de l'utilisateur
Creat
End Sub

L'administrateur a aussi la possibilité de valider la création d'un nouvel utilisateur en appuyant sur la touche Entrée. Cette action exécute en fait la procédure Entr() sur l'événement Sur touche appuyée du formulaire.

Private Sub Entr() 'Procédure de validation avec la touche Entrée
Creanouv.SetFocus
Creanouv_Click
End Sub

Appel de la procédure de création d'un nouvel utilisateur :

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 'Validation création de l'utilisateur avec la touche Entrée
If KeyCode = vbKeyReturn Then
Entr
End If
End Sub

Pour pouvoir utiliser la touche Entrée, il faut qu'au niveau de l'onglet Événement des propriétés du formulaire, Aperçu des touches soit à Oui.

Lors de la saisie, si des zones de texte ont été laissées vides lors de la validation, un message en avertit l'administrateur.

Pour la zone de texte Identifiant vide :

Pour la zone de texte Nom vide :

Pour la zone de texte Prénom vide :

En ce qui concerne la zone Groupe, l'administrateur, grâce à la liste déroulante, choisit le statut Administrateur ou Utilisateur qu'il veut attribuer. Il est prévenu quand il veut créer un utilisateur qui possède déjà un compte avec un statut identique à celui saisi.

Pour la zone de texte Mot de passe laissée vide ou présentant moins de 9 caractères :

Après vérification, si tous les critères ont été remplis pour la validation, l'administrateur est informé que l'utilisateur a bien été créé.

Après le clic sur OK, le formulaire F_GESTUTIL est à nouveau ouvert actualisé et F_GESTNOUV est fermé.

X-B-2 - Attribuer le mot de passe par défaut

Lors de la création d'un nouvel utilisateur, en cliquant sur le bouton Mot de passe par défaut, l'administrateur peut attribuer d'emblée le mot de passe par défaut (ici : azerty123) dans la mesure où celui-ci n'est utilisé que pour un seul des profils de l'utilisateur.

Code associé au bouton Mot de passe par défaut :

Private Sub Mdpdef_Click() 'Attribution du mot de passe par défaut
Me.Mdpnouv = Mdef
MsgBox "Mot de passe par défaut attribué.", vbInformation, "Création utilisateurs"
End Sub

Quand le mot de passe par défaut est attribué, un message en informe l'administrateur.

X-B-3 - Annuler la création d'un nouvel utilisateur

En cliquant sur le bouton Annuler, l'administrateur peut abandonner la création d'un utilisateur. Dans ce cas, le formulaire est fermé sans sauvegarder l'enregistrement en cours et l’application retourne sur le formulaire de gestion des utilisateurs.

Macro associée au bouton Annuler

X-B-4 - Avant de poursuivre

On peut maintenant créer un compte Administrateur.

Pour cela, il faut ouvrir le formulaire F_GESTNOUV en double-cliquant dessus, puis saisir les informations de l'utilisateur dans les zones de texte et cliquer sur le bouton Valider. On revient alors sur le formulaire de gestion des utilisateurs, et il ne reste plus qu'à cliquer sur le bouton Quitter.

En double cliquant sur la table T_USERS, on l'ouvre pour vérifier que le compte a bien été créé.

XI - Le formulaire de modification des utilisateurs

Le formulaire F_GESTMOD sert à modifier les profils des utilisateurs déjà présents dans la table T_USERS. Il est appelé depuis le formulaire de gestion des utilisateurs en cliquant sur le bouton Modifier après avoir sélectionné le profil de l'utilisateur à mettre à jour.

Mode création

Mode formulaire

XI-A - Composants et propriétés du formulaire

Composant

Onglet

Propriétés

Formulaire

Format

Légende : Gestion des utilisateurs - Modification
Affichage par défaut : Formulaire unique
Autoriser le mode formulaire : Oui
Autoriser le mode feuille de données : Non
Autoriser le mode page : Non
Afficher sélecteur : Non
Bouton de déplacement : Non
Zone contrôle : Non
Bouton fermer : Non
Bouton MinMax : Aucun
Déplaçable : Non

Événement

Sur chargement : [Procédure événementielle]
Sur touche appuyée : [Procédure événementielle]
Sur touche activée : [Procédure événementielle]
Aperçu des touches : Oui

Autres

Fenêtre contextuelle : Oui
Fenêtre modale : Oui

Zone de texte : ID copie

Format

Visible : Non

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![IDgest]

Autres

Nom : IDmod

Zone de texte : Identifiant

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Identgest]

Événement

Après MAJ : [Procédure événementielle]

Autres

Nom : Identmod

Zone de texte : Identif copie

Format

Visible : Non

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Identgest]

Autres

Nom : Identcopie

Zone de texte : Nom

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Nomgest]

Événement

Après MAJ : [Procédure événementielle]

Autres

Nom : Nommod

Zone de texte : Nom copie

Format

Visible : Non

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Nomgest]

Autres

Nom : Nomcopie

Zone de texte : Prénom

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Pregest]

Événement

Après MAJ : [Procédure événementielle]

Autres

Nom : Premod

Zone de texte : Prénom copie

Format

Visible : Non

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Pregest]

Autres

Nom : Precopie

Zone de liste déroulante : Groupe

Données

Contenu : SELECT T_GROUPE.GROUPE FROM T_GROUPE;
Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Gpegest]

Événement

Sur changement : [Procédure événementielle]

Autres

Nom : Gpemod

Zone de texte : Gpe copie

Format

Visible : Non

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Gpegest]

Autres

Nom : Gpecopie

Zone de texte : Mot de passe

Données

Masque de saisie : Mot de passe
Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Mdpgest]

Événement

Après MAJ : [Procédure événementielle]

Autres

Nom : Mdpmod

Zone de texte : Mdp copie

Format

Visible : Non

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Mdpgest]

Autres

Nom : Mdpcopie

Bouton : Réinitialiser mot de passe

Événement

Sur clic : [Procédure événementielle]

Autres

Nom : Mdpinit

Bouton : Annuler

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Annulmod

Bouton : Créer

Événement

Sur clic : [Procédure événementielle]

Autres

Nom : Valmod

XI-B - Macros et codes du formulaire

Le contenu des zones Identifiant, Nom, Prénom, Groupe et Mot de passe est vérifié après chaque modification. Ces zones ne doivent ainsi en aucun cas être vides. Lors de la modification du groupe, l'utilisateur ne doit pas posséder le statut de la modification pour un autre de ses profils. La zone de texte Mot de passe doit impérativement être renseignée avec 9 caractères au minimum. De plus, le mot de passe ne doit pas être identique à celui d'un autre profil de l'utilisateur.

Au chargement de F_GESTMOD, le formulaire F_GESTUTIL est masqué.

Private Sub Form_Load() 'Masquer le formulaire de gestion des utilisateurs
Forms!F_GESTUTIL.Visible = No
End Sub

Dans ce formulaire, il faut aussi interdire toute saisie clavier au niveau de la liste déroulante du groupe d'appartenance de l'utilisateur. Pour cela, au niveau de Sur touche appuyée dans l’onglet Événement des propriétés de la zone de liste déroulante Gpemod, il faut positionner le code suivant :

Private Sub Gpemod_KeyDown(KeyCode As Integer, Shift As Integer) 'Interdiction saisie clavier dans  de la zone de liste déroulante
If KeyCode <> 9 Then  'Si touche appuyée <> de Tab
KeyCode = 0 'Interdit la saisie au clavier
End If
End Sub

Dès l'ouverture du formulaire F_GESTMOD, le contenu des champs de l'enregistrement à modifier est récupéré dans F_GESTUTIL. Pour cela, la valeur par défaut des zones de texte est définie. Ceci permet notamment de revenir aux valeurs par défaut en cas de modifications non validées.

XI-B-1 - Tests des modifications des zones de saisie

Toute modification dans une zone de texte est testée dès qu'elle est réalisée.

Pour tester la modification de la zone de texte Identifiant, la procédure suivante est appelée après la modification de la zone de texte.

Private Sub Modident() 'Procédure de modification de l'identifiant
Dim SQL2 As String
Dim rst As DAO.Recordset
'Test présence d'un identifiant
If Len(Me.Identmod.Value & vbNullString) = 0 Then
MsgBox "Attention ! Identifiant requis. Le champ modifié est remis à sa valeur initiale.", vbExclamation, "Modification utilisateurs"
Me.Identmod = Me.Identcopie
Else
'Test non-présence de l'utilisateur dans le groupe
SQL2 = "SELECT TRIGRAMME FROM T_USERS WHERE TRIGRAMME = """ & Me.Identmod & """ AND GROUPE = '" & Me.Gpemod & "';"
Set rst = CurrentDb.OpenRecordset(SQL2)
If Not rst.EOF Then
MsgBox "Attention ! Utilisateur déjà présent dans ce groupe. Le champ modifié est remis à sa valeur initiale.", vbExclamation, "Modification utilisateurs"
Me.Identmod = Me.Identcopie
End If
'Libération de la variable objet
rst.Close
Set rst = Nothing
End If
End Sub

Appel de la procédure après modification de la zone de texte Identifiant :

Private Sub Identmod_AfterUpdate() 'Modification identifiant
Modident
End Sub

Si la zone de texte Identifiant est vide, l'administrateur en est informé et il est averti que la zone reprend sa valeur initiale.

Il en va de même si l'identifiant est identique à l'identifiant d'un utilisateur dans le même groupe.

Pour tester la modification de la zone de texte Nom :

Private Sub Nommod_AfterUpdate() 'Modification nom
'Test présence du nom
If Len(Me.Nommod.Value & vbNullString) = 0 Then
MsgBox "Attention ! Nom requis. Le champ modifié est remis à sa valeur initiale.", vbExclamation, "Modification utilisateurs"
Me.Nommod = Me.Nomcopie
End If
End Sub

Si la zone de texte Nom est vide :

Pour tester la modification de la zone de texte Prénom :

Private Sub Premod_AfterUpdate() 'Modification prénom
'Test présence du prénom
If Len(Me.Premod.Value & vbNullString) = 0 Then
MsgBox "Attention ! Prénom requis. Le champ modifié est remis à sa valeur initiale.", vbExclamation, "Modification utilisateurs"
Me.Premod = Me.Precopie
End If
End Sub

Si la zone de texte Prénom est vide :

Pour tester la modification de la zone de liste déroulante Groupe, la procédure suivante est appelée après la modification.

Private Sub Modstat() 'Procédure de modification du statut utilisateur
Dim SQL1 As String
Dim rs As DAO.Recordset
'Test non-présence de l'utilisateur dans le groupe sélectionné
SQL1 = "SELECT GROUPE FROM T_USERS WHERE TRIGRAMME = """ & Me.Identmod & """ AND GROUPE = '" & Me.Gpemod & "';"
Set rs = CurrentDb.OpenRecordset(SQL1)
If Not rs.EOF Then
MsgBox "Attention ! Utilisateur déjà présent dans ce groupe. Le champ modifié est remis à sa valeur initiale.", vbExclamation, "Modification utilisateurs"
Me.Gpemod = Me.Gpecopie
End If
'Libération de la variable objet
rs.Close
Set rs = Nothing
End Sub

Appel de la procédure après modification de la zone de liste déroulante Groupe :

Private Sub Gpemod_Change() 'Modification statut utilisateur
Modstat
End Sub

Si l'utilisateur est déjà présent dans le groupe sélectionné :

Pour tester la modification de la zone de texte Mot de passe, la procédure suivante est appelée après la modification.

Private Sub Modmdp() 'Procédure de modification du mot de passe
Dim SQL3 As String
Dim rsu As DAO.Recordset
Select Case True
'Test longueur du mot de passe
Case Len(Me.Mdpmod.Value & vbNullString) = 0 Or Len(Me.Mdpmod) < 9
MsgBox "Attention ! Le mot de passe doit être composé d'au moins 9 caractères. Le champ modifié est remis à sa valeur initiale.", vbExclamation, "Modification utilisateurs"
Me.Mdpmod = Me.Mdpcopie
Case Len(Me.Mdpmod) >= 9 And Me.Mdpmod <> Me.Mdpcopie
'Crypte le mot de passe
Cryp = Crypter(Mdpmod.Value)
'Le mot de passe prend sa valeur cryptée
Me.Mdpmod = Cryp
'Test non-utilisation du mot de passe dans un autre profil
SQL3 = "SELECT PASWD FROM T_USERS WHERE TRIGRAMME = """ & Me.Identmod & """ AND PASWD = '" & Cryp & "';"
Set rsu = CurrentDb.OpenRecordset(SQL3)
If Not rsu.EOF Then
MsgBox "Attention ! Mot de passe déjà utilisé dans un autre profil de cet utilisateur. Veuillez en utiliser un autre. Le champ modifié est remis à sa valeur initiale.", vbExclamation, "Modification utilisateurs"
Me.Mdpmod = Me.Mdpcopie
End If
'Libération de la variable objet
rsu.Close
Set rsu = Nothing
End Select
End Sub

Appel de la procédure après modification de la zone de texte Mot de passe :

Private Sub Mdpmod_AfterUpdate() 'Modification mot de passe
Modmdp
End Sub

Si la zone de texte Mot de passe est vide ou composé de moins de 9 caractères :

Si la saisie dans la zone de texte Mot de passe est identique au mot de passe d'un autre profil de l'utilisateur :

XI-B-2 - Réinitialiser le mot de passe

En cliquant sur le bouton Réinitialiser mot de passe, l'administrateur peut réattribuer le mot de passe par défaut (ici : azerty123) à l'utilisateur dans la mesure où celui-ci n'est utilisé que pour un seul des profils de l'utilisateur.

Procédure appelée par le bouton Réinitialiser mot de passe :

Private Sub Initmdp() 'Procédure de réinitialisation du mot de passe
Me.Mdpmod = Mdef
MsgBox "Mot de passe par défaut attribué.", vbInformation, "Modification utilisateurs"
Modmdp
End Sub

Code associé au bouton Réinitialiser mot de passe :

Private Sub Mdpinit_Click() 'Attribution mot de passe par défaut
Initmdp
End Sub

Un message informe l'administrateur qu'il a réattribué le mot de passe par défaut.

XI-B-3 - Valider les modifications du profil utilisateur

Lorsqu’on clique sur le bouton Valider, la procédure suivante est appelée.

Private Sub Modif() 'Procédure de validation des modifications
Dim SQL4 As String
SQL4 = "UPDATE T_USERS SET TRIGRAMME = """ & Me.Identmod & """, NOM_UTIL = """ & Me.Nommod & """, PRENOM = """ & Me.Premod & """, GROUPE = '" & Me.Gpemod & "', PASWD = '" & Me.Mdpmod & "' WHERE ID = " & Me.IDmod & ";"
CurrentDb.Execute SQL4, dbFailOnError
MsgBox "Modification utilisateur réussie.", vbInformation, "Modification utilisateurs"
Forms!F_GESTUTIL.Refresh 'Rafraîchissement formulaire de gestion des utilisateurs
DoCmd.Close acForm, "F_GESTMOD"
End Sub

Code associé au bouton Valider :

Private Sub Valmod_Click() 'Validation modifications des champs
Modif
End Sub

Ici aussi, il est possible de valider les modifications en utilisant la touche Entrée. Pour faire cela, la procédure suivante est appelée au niveau de Sur touche appuyée dans l'onglet Événement des propriétés du formulaire.

Private Sub Entr() 'Procédure de validation avec la touche Entrée
Valmod.SetFocus
Valmod_Click
End Sub

Appel de la procédure de validation des modifications :

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 'Validation modifications avec la touche Entrée
If KeyCode = vbKeyReturn Then
Entr
End If
End Sub

Pour pouvoir utiliser la touche Entrée, il faut qu'au niveau de l'onglet Événement des propriétés du formulaire, Aperçu des touches soit à Oui.

Quand la modification est réussie, l'administrateur en est informé.

À la fermeture du message de modification réussie, F_GESTMOD est fermé et l'administrateur revient sur F_GESTUTIL actualisé.

XI-B-4 - Annuler les modifications du profil utilisateur

L'administrateur, en cliquant sur le bouton Annuler, peut abandonner la modification d'un utilisateur. Dans ce cas, le formulaire est fermé et l'enregistrement en cours n'est pas sauvegardé.

Macro associée au bouton Annuler

XI-B-5 - Retour au formulaire de gestion des utilisateurs

Après chaque fermeture du formulaire F_GESTMOD, l'administrateur revient sur F_GESTUTIL le formulaire de gestion des utilisateurs qui était jusque là masqué.

Private Sub Form_Close() 'Remettre en avant le formulaire de gestion des utilisateurs
Forms!F_GESTUTIL.SetFocus
End Sub

XII - Le formulaire de suppression des utilisateurs

Le formulaire F_GESTSUP sert à supprimer les profils des utilisateurs déjà présents dans T_USERS. Il est appelé depuis le formulaire de gestion des utilisateurs F_GESTUTIL en cliquant sur le bouton Supprimer après avoir sélectionné le profil de l'utilisateur à supprimer.

Mode création

Mode formulaire

XII-A - Composants et propriétés du formulaire

Composant

Onglet

Propriétés

Formulaire

Format

Légende : Gestion des utilisateurs - Suppression
Affichage par défaut : Formulaire unique
Autoriser le mode formulaire : Oui
Autoriser le mode feuille de données : Non
Autoriser le mode page : Non
Afficher sélecteur : Non
Bouton de déplacement : Non
Zone contrôle : Non
Bouton fermer : Non
Bouton MinMax : Aucun
Déplaçable : Non

Événement

Sur chargement : [Procédure événementielle]
Sur touche appuyée : [Procédure événementielle]
Sur fermeture : [Procédure événementielle]
Aperçu des touches : Oui

Autres

Fenêtre contextuelle : Oui
Fenêtre modale : Oui

Zone de texte : Identifiant

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Identgest]
Verrouillé : Oui

Autres

Nom : Identsup

Zone de texte : Nom

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Nomgest]
Verrouillé : Oui

Autres

Nom : Nomsup

Zone de texte : Prénom

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Pregest]
Verrouillé : Oui

Autres

Nom : Presup

Zone de texte : Groupe

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Gpegest]
Verrouillé : Oui

Autres

Nom : Gpesup

Zone de texte : Mot de passe

Format

Visible : Non

Données

Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Mdpgest]

Autres

Nom : Mdpsup

Bouton : Annuler

Événement

Sur clic : [Macro incorporée]

Autres

Nom : Annulsup

Bouton : Supprimer

Événement

Sur clic : [Procédure événementielle]

Autres

Nom : Valsup

XII-B - Macros et codes du formulaire

Dès l'ouverture du formulaire F_GESTSUP, il faut récupérer dans F_GESTUTIL les données de l'enregistrement sélectionné à supprimer. Celles-ci sont copiées comme prévu précédemment en paramétrant les valeurs par défaut des zones de texte et de liste déroulante.

Identifiant, Nom, Prénom, Groupe et Mot de passe ne sont pas modifiables. Ces zones ont alors la valeur de celles de l'enregistrement sélectionné dans le formulaire F_GESTUTIL.

Au chargement de F_GESTSUP, le formulaire F_GESTUTIL est masqué.

Private Sub Form_Load() 'Masquer le formulaire de gestion des utilisateurs
Forms!F_GESTUTIL.Visible = No
End Sub

XII-B-1 - Valider la suppression d'un utilisateur

La demande de suppression de l'utilisateur se fait en cliquant sur le bouton Supprimer.

La procédure suivante de suppression d'un utilisateur est appelée par le bouton Supprimer.

Private Sub Suppr() 'Procédure de suppression d'un utilisateur
Dim SQL As String
Dim Rep As Integer
Rep = MsgBox("Confirmez-vous la suppression de cet utilisateur ?", vbYesNo + vbQuestion, "Suppression utilisateurs")
If Rep = vbYes Then
SQL = "DELETE FROM T_USERS WHERE TRIGRAMME = """ & Me.Identsup & """ AND GROUPE = '" & Me.Gpesup & "' AND PASWD = '" & Me.Mdpsup & "';"
CurrentDb.Execute (SQL)
MsgBox "Suppression utilisateur réussie.", vbInformation, "Suppression utilisateurs"
Forms!F_GESTUTIL.Refresh 'Rafraîchissement formulaire de gestion des utilisateurs
DoCmd.Close acForm, "F_GESTSUP"
Else
DoCmd.Close acForm, "F_GESTSUP"
End If
End Sub

Code associé au bouton Supprimer :

Private Sub Valsup_Click() 'Suppression de l'utilisateur
Suppr
End Sub

L'administrateur a aussi la possibilité de demander la suppression de l'utilisateur en utilisant la touche Entrée. La procédure suivante est appelée Sur touche appuyée dans les propriétés du formulaire au niveau de l'onglet Événement.

Private Sub Entr() 'Procédure de validation avec la touche Entrée
Valsup.SetFocus
Valsup_Click
End Sub

Appel de la procédure de validation de la suppression de l'utilisateur :

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 'Validation suppression de l'utilisateur avec la touche Entrée
If KeyCode = vbKeyReturn Then
Entr
End If
End Sub

Pour pouvoir utiliser la touche Entrée, il faut qu'au niveau de l'onglet Événement des propriétés du formulaire, Aperçu des touches soit à Oui.

Un message s'ouvre pour demander la confirmation de la suppression de l'utilisateur.

Si l'administrateur clique sur Non, le formulaire F_GESTSUP se ferme. Il est alors renvoyé sur F_GESTUTIL qui était jusque là masqué. L'utilisateur n'est pas supprimé.

Si l'administrateur clique sur Oui, l'utilisateur est supprimé. Quand la suppression a été réalisée, un message apparaît.

Après un clic sur OK, l'administrateur revient sur le formulaire F_GESTUTIL.

XII-B-2 - Retour au formulaire de gestion des utilisateurs

À chaque fermeture de F_GESTSUP, l'administrateur est renvoyé au formulaire de gestion des utilisateurs qui est jusque là masqué.

Private Sub Form_Close() 'Remettre en avant le formulaire de gestion des utilisateurs
Forms!F_GESTUTIL.SetFocus
End Sub

Quand la fermeture de F_GESTSUP se produit après une suppression, l'administrateur est renvoyé au formulaire F_GESTUTIL qui lui indique que l'enregistrement est supprimé.

Après fermeture et réouverture de F_GESTUTIL, ces indications de suppression ne réapparaîtront plus.

XII-B-3 - Annuler la suppression d'un utilisateur

L'administrateur, en cliquant sur le bouton Annuler, peut abandonner la demande de suppression d'un utilisateur. Dans ce cas, le formulaire est fermé et l'enregistrement en cours n'est pas supprimé. L'administrateur est alors renvoyé sur F_GESTUTIL.

Macro associée au bouton Annuler

XIII - Sécuriser l'application

L'objectif n'est pas de proposer une solution optimale pour sécuriser une base de données ACCESS, mais avant tout de rendre son accès difficile pour des personnes non autorisées.

XIII-A - Masquer les objets, paramétrer l'ouverture et la présentation de l'application

Dans un premier temps, masquer les objets de la base de données en faisant un clic droit sur chaque groupe d'objets et en choisissant « Masquer ».

Ensuite, se rendre dans les Options d'ACCESS, puis choisir « Base de données active » pour paramétrer l'ouverture et la présentation de l'application.

À l'ouverture de l'application, afficher le formulaire F_CONNEXION.

Ensuite les autres paramétrages sont expliqués à l'aide de deux exemples.

XIII-A-1 - 1er exemple

Paramétrage au niveau de la base active dans les options d'ACCESS

Il est aussi possible d'interdire les menus contextuels dans les options de la base de données active. Si maintenant l'administrateur a besoin d'intervenir sur la structure ou le code, comme ce sera expliqué dans le paragraphe « Contrer le contournement du formulaire de connexion », il n'a qu'à mettre la base en mode sécurité désactivée dans le formulaire F_GESTUTIL, puis la fermer et la rouvrir en tenant appuyée la touche Shift pour y accéder en mode création.

XIII-A-2 - 2e exemple

Paramétrage au niveau de la base active dans les options d'ACCESS

Dans cet exemple, la solution consiste à interdire les menus contextuels uniquement pour les formulaires F_CONNEXION, F_APPLICATION et F_CHGTMDP accessibles aux simples utilisateurs. Il n'est évidemment pas nécessaire de les interdire sur les formulaires réservés aux administrateurs.

Mettre la propriété Menu contextuel à Non pour les formulaires précédemment cités afin d’ interdire qu'un utilisateur accède par un clic droit au menu contextuel puis aux formulaires en mode création.

Ajouter aussi au niveau des modules des formulaires de connexion et de l'application, les lignes de code permettant à un administrateur d'accéder à ce menu.

1 - Modification au niveau de F_CONNEXION :

Private Sub Connect() 'Procédure de connexion suivant les critères de validation de la connexion
Dim SQL As String
Dim rs As DAO.Recordset
Static i As Byte
If Len(Me.txt_pass.Value & vbNullString) = 0 Then 'Test complétude de la zone de texte du mot de passe
MsgBox "Merci de saisir votre mot de passe pour vous connecter.", vbExclamation, "Connexion"
Else
'Crypte le mot de passe
Cryp = Crypter(Me.txt_pass.Value)
'Création de variables temporaires
Application.TempVars.Add "Identuser", Me.txt_user.Value
Application.TempVars.Add "Mdpuser", Crypter(Me.txt_pass.Value)
End If
'Connexion suivant login/mot de passe
SQL = "SELECT GROUPE FROM T_USERS WHERE TRIGRAMME = """ & Me.txt_user & """ AND PASWD = """ & Cryp & """;"
Set rs = CurrentDb.OpenRecordset(SQL)
If Not rs.EOF Then
DoCmd.GoToRecord , , acLast  'Aller au dernier enregistrement du formulaire
Me.Acconnex = "Ok" 'Récupération info de connexion réussie
Me.[CONNEXION] = Me.Acconnex 'Inscription du statut de connexion dans T_LOG
DoCmd.OpenForm "F_APPLICATION", acNormal, , , , acWindowNormal
'Autorisation menu contextuel sur F_APPLICATION pour un administrateur
If rs!GROUPE = "Administrateur" Then
Forms!F_APPLICATION.ShortcutMenu = True
End If
If Me.txt_pass = Mdef Then 'Repérage mot de passe de première connexion
MsgBox "Première connexion. Vous devez changer de mot de passe.", vbInformation, "Changement mot de passe"
'Ouverture du formulaire de changement de mot de passe selon l'identifiant et le mot de passe de l'utilisateur
DoCmd.OpenForm "F_CHGTMDP", , , "[TRIGRAMME] = """ & Me.txt_user & """ and [PASWD] = """ & Cryp & """"
End If
DoCmd.Close acForm, "F_CONNEXION"
Else
'Réponses aux tentatives de connexion erronées
i = i + 1
Select Case i
Case 1
MsgBox "Première Tentative - Attention ! Identifiant et/ou Mot de Passe incorrect(s). À la troisième tentative erronée, fermeture de l'application.", vbExclamation, "Connexion"
Case 2
MsgBox "Deuxième Tentative - Attention ! Identifiant et/ou Mot de Passe incorrect(s). À la troisième tentative erronée, fermeture de l'application.", vbExclamation, "Connexion"
Case 3
DoCmd.GoToRecord , , acLast 'Aller au dernier enregistrement du formulaire
Me.Acconnex = "Echec" 'Récupération info d'échec de connexion
Me.[CONNEXION] = Me.Acconnex 'Inscription du statut de connexion dans T_LOG
MsgBox "Troisième Tentative - Fermeture de l'application. Vous avez dépassé le nombre de tentatives autorisées.", vbCritical, "Connexion"
DoCmd.Quit
End Select
End If
'Libération de la variable objet
rs.Close
Set rs = Nothing
End Sub

2 - Modifications au niveau de F_APPLICATION :

Procédure d'ouverture du formulaire F_CHGTMDP dans laquelle est autorisé le menu contextuel pour un administrateur.

Private Sub Changemdp() 'Procédure d'ouverture du formulaire de changement de mot de passe selon identifiant et mot de passe + menu contextuel
'DoCmd.OpenForm "F_CHGTMDP", , , "[TRIGRAMME] = """ & Me.Identuser & """ and [PASWD] = """ & Me.Mdpuser & """"
'Autorisation menu contextuel sur F_CHGTMDP pour un administrateur
'If Me!Gestutil.Visible = True Then
'Forms!F_CHGTMDP.ShortcutMenu = True
'End If
End Sub

Appel de la procédure d'ouverture du formulaire de changement de mot de passe :

Private Sub Chgtmdp_Click() 'Ouverture du formulaire de changement de mot de passe selon l'identifiant et le mot de passe de l'utilisateur
Changemdp
End Sub

XIII-B - Contrer le contournement du formulaire de connexion

Il est impossible de sécuriser parfaitement une application développée avec ACCESS. Cependant, on peut empêcher la pratique qui consiste à contourner le formulaire de connexion en double cliquant sur l'icône de l'application tout en maintenant simultanément appuyée la touche Shift (Maj).

L'administrateur peut en effet choisir d'activer ou pas la touche Shift depuis le formulaire de gestion des utilisateurs F_GESTUTIL.

Le code associé à la liste déroulante Sécurité base exécute ainsi au choix les fonctions ap_EnableShift ou ap_DisableShift présentes dans le module de gestion de la touche Shift.

Tout d'abord, interdiction de la saisie de caractères dans la zone de liste déroulante Sécurité base.

Private Sub Secubase_KeyDown(KeyCode As Integer, Shift As Integer) 'Interdiction saisie clavier dans la zone de liste déroulante
If KeyCode <> 9 Then  'Si touche appuyée <> de Tab
KeyCode = 0 'Interdit la saisie au clavier
End If
End Sub

Ensuite, activation / désactivation de la touche Shift (Maj).

Private Sub Secubase_LostFocus() 'Activation / désactivation touche Shift (Maj)
If Secubase = "Activée" Then
ap_DisableShift
ElseIf Secubase = "Désactivée" Then
ap_EnableShift
End If
End Sub

Cette solution peut convenir si l'application est installée sur un lecteur sécurisé dont l'accès est limité à un nombre restreint d'utilisateurs.

La désactivation de la touche Shift ne constitue pas à elle seule une sécurité suffisante. Elle n'interdit notamment pas l'importation des données de la base depuis une autre application ACCESS.

XIII-C - Chiffrer la base de données

Pour apporter une sécurité bien plus efficace, il faut alors passer par le chiffrement de la base de données comme défini par Microsoft.

https://support.microsoft.com/fr-fr/office/chiffrer-une-base-de-donn%C3%A9es-%C3%A0-l-aide-d-un-mot-de-passe-de-base-de-donn%C3%A9es-12aa0e5c-34c6-4957-af3b- b5f5cfa9a766

« Chiffrer une base de données

1. Ouvrez la base de données en mode Exclusif.
Comment ouvrir une base de données 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.

2. 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.

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

Si vous choisissez de chiffrer la base de données, certes cela apporte une meilleure sécurité, mais cela nécessite aussi de donner le mot de passe pour déchiffrer la base à l'ensemble des utilisateurs.

Le chiffrement de la base de données empêche aussi le contournement avec la touche Shift et l'importation des données depuis une autre application.

Attention de ne pas oublier le mot de passe !

XIV - Tester le fonctionnement

Un test de l'application nécessiterait au moins de créer des comptes Windows factices, mais c'est aussi possible de désactiver temporairement la ligne de code qui récupère l'identifiant de la session Windows au niveau du formulaire F_CONNEXION, puis de choisir un nom d'utilisateur arbitraire pour se connecter.

Private Sub Form_Open(Cancel As Integer) 'Récupération de l'identifiant de session Windows de l'utilisateur
'Modification temporaire pour tester à rétablir après les tests.
'Me.txt_user = Environ$("username")
Me.txt_user = "Chrispi" 'Ici exemple arbitraire d'identifiant à saisir pour se connecter
End Sub

Pour tester réellement l'application, il faut donc à minima créer un compte administrateur et un compte utilisateur dans la table T_USERS depuis le formulaire F_GESTNOUV.

À l'issue des tests, il faut penser à réactiver la ligne de code de récupération de l'identifiant qui a été neutralisée et supprimer celle concernant l'identifiant arbitraire de test.

XV - Intégrer les fonctions décrites dans ce tutoriel à votre base de données

Il y a deux façons pratiques pour intégrer cette solution de connexion dans une base de données.

1re méthode

Elle consiste à importer les objets (tables, états, requêtes, formulaires…) de votre fichier ACCESS dans la base que nous avons réalisée.

2e méthode

Il s'agit de faire l'inverse de ce qui est fait dans la première méthode. À savoir importer les objets de la solution de connexion dans la base de données que vous souhaitez gérer et sécuriser.

Dans ce tutoriel, F_APPLICATION représente le formulaire principal de la base de données dont vous désirez gérer les accès. Donc, cela suppose que vous implantiez les composants, les macros et les codes de F_APPLICATION dans le formulaire principal de votre application. Ensuite, il faut supprimer F_APPLICATION et procéder à quelques ajustements de code où cela y fait référence Il faut notamment aussi penser à adapter au besoin les chemins des fichiers Fichutil.txt et Fichlog.log pour obtenir un tout cohérent.

XVI - Conclusion

Nous voilà parvenus au terme de ce tutoriel.

En résumé, nous avons un formulaire de connexion avec identifiant et mot de passe qui faute de sécuriser parfaitement l'application, permet d'en limiter l'accès. Nous permettons aussi aux utilisateurs de changer leur mot de passe et aux administrateurs de gérer les droits de chacun depuis des formulaires spécifiques. Nous avons aussi une solution de traçage des logs de connexion. Pour terminer, nous savons comment améliorer la sécurisation de la base et intégrer ces composants à vos applications.

Maintenant, appropriez-vous ce tutoriel, utilisez-le comme bon vous semble, soyez créatif pour l'améliorer et ensuite partager.

XVII - Remerciements

Je tiens à remercier gaby277 et Pierre Fauconnier qui se sont intéressés à mon travail d'élaboration de ce tutoriel et m'ont donné de précieux conseils.

Je remercie ici chaleureusement User pour sa grande implication. Il a su prendre le flambeau pour m'accompagner et m'aider tant sur les aspects techniques que rédactionnels. Grâce à son savoir et à son accompagnement bienveillant pour la réalisation de ce tutoriel, j'ai beaucoup appris.

Je remercie aussi escartefigue pour la relecture orthographique qui contribue notablement à la qualité de nos écrits.