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▲
- 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 |
Données |
Source : T_LOG |
|
Événement |
Sur chargement : [Procédure événementielle] |
|
Autres |
Fenêtre contextuelle : 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.
VII-A. Composants et propriétés du formulaire▲
Composant |
Onglet |
Propriétés |
Formulaire |
Format |
Légende : Application |
Événement |
Sur chargement : [Procédure événementielle] |
|
Autres |
Fenêtre contextuelle : 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 |
Événement |
Sur clic : [Macro incorporée] |
|
Autres |
Nom : Chgtmdp |
|
Étiquette : Gestion utilisateurs |
Format |
Légende : Gestion utilisateurs |
É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 |
Données |
Source : T_USERS |
|
Événement |
Sur chargement : [Procédure événementielle] |
|
Autres |
Fenêtre contextuelle : 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.
IX-A. Composants et propriétés du formulaire▲
Composant |
Onglet |
Propriétés |
Formulaire |
Format |
Légende : Gestion des utilisateurs |
Données |
Source : T_USERS |
|
Autres |
Fenêtre contextuelle : 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 |
Autres |
Nom : Identgest |
|
Zone de texte: Nom |
Données |
Source contrôle : NOM |
Autres |
Nom : Nomgest |
|
Zone de texte: Prénom |
Données |
Source contrôle : PRENOM |
Autres |
Nom : Pregest |
|
Zone de texte: Groupe |
Données |
Source contrôle : GROUPE |
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; |
Événement |
Sur perte focus : [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.
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.
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.
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.
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.
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.
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.
X-A. Composants et propriétés du formulaire▲
Composant |
Onglet |
Propriétés |
Formulaire |
Format |
Légende : Gestion des utilisateurs - Création |
Événement |
Sur chargement : [Macro incorporée] |
|
Autres |
Fenêtre contextuelle : 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; |
É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.
XI-A. Composants et propriétés du formulaire▲
Composant |
Onglet |
Propriétés |
Formulaire |
Format |
Légende : Gestion des utilisateurs - Modification |
Événement |
Sur chargement : [Procédure événementielle] |
|
Autres |
Fenêtre contextuelle : 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; |
É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 |
É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.
XII-A. Composants et propriétés du formulaire▲
Composant |
Onglet |
Propriétés |
Formulaire |
Format |
Légende : Gestion des utilisateurs - Suppression |
Événement |
Sur chargement : [Procédure événementielle] |
|
Autres |
Fenêtre contextuelle : Oui |
|
Zone de texte : Identifiant |
Données |
Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Identgest] |
Autres |
Nom : Identsup |
|
Zone de texte : Nom |
Données |
Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Nomgest] |
Autres |
Nom : Nomsup |
|
Zone de texte : Prénom |
Données |
Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Pregest] |
Autres |
Nom : Presup |
|
Zone de texte : Groupe |
Données |
Valeur par défaut : =[Formulaires]![F_GESTUTIL]![Gpegest] |
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▲
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▲
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.
« Chiffrer une base de données
-
Ouvrez la base de données en mode Exclusif.
Comment ouvrir une base de données 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.
-
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 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.
1 re 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.
2 e 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.