1 1 1 1 1 1 1 1 1 1 Rating 4.80 (5 Votes)
   
 

Problemstellung:

Beispiel-DB für eine Userverwaltung mit verschlüsselten Passwörtern und verschiedenen Rechten

Voraussetzungen und benötigte Dateien:

Das Bsp ist ab A00 lauffähig.

-tk_User00_FE.mde, das Frontend für das Bsp
-tk_User00_FE.mdb, das Frontend für das Bsp (nur für die Sichbarkeit des Codes)
-tk_User00_BE.mdb, das Backend für das Bsp

Beide Dateien müssen sich, wegen der Tabellenverknüfungen zur Demonstration im Verzeichnis
„C:\Userverwaltung“ befinden.


-CrypterPW.dll enthält die Ver- und Entschlüsselungsalgorithmen, Datei wird während der
Installation in das WinSys-Dir kopiert und registriert.
Bei der Deinstallation wird die Datei automatisch mit entfernt.
Diese DLL ist eine ActiveX-DLL in VB6 geschrieben.

tk_User00_BE.mdb enthaltenen Objekte und deren Funktion:

Abfragen:
qry_Filter_logon: wird für das Startform, zur Anzeige des eingeloggten Users benötigt.

Formulare:
frm_User_anmelden: wird beim Start des Programms geladen zum Einloggen in die DB
frm_User_Passwort_Neu: zum Passwort ändern
frm_PW_Return: Hilfsform zum zurücksetzen das Passworts (wird nicht angezeigt)
frm_Flag: Form zum setzen des LogOffFlags zum schliessen aller FE’s (nur für Admin’s)
frmAutoLogOff: Hilfsform zum Prüfen des Flags (wird beim Start durch das Autoexec-Makro beim Start versteckt geladen.
frmAutoLogOffMsgBox: Anzeige als Hinweis für die User das, das FE in 60 Sek geschlossen wird.
frm_Userstamm: Anzeige und bearbeiten der User (nur für Admin’s)
frm_Start: nur zur Demonstration der Rechte

Makros:
Autoexec:
lädt das Form „frmAutoLogOff“

Module:
mod_Funktionen: enthält einige benötigte Funktionen

Funktionsweise:

1. Schliessen aller FE’s, ausgelöst durch den Admin.
Der Admin hat die Möglichkeit durch setzen des LogOffFlag alle geöffneten FE’s nach 60 sek Schließen zulassen.
Timer ist auf 60000 (60 Sek) eingestellt.
Wie funktionierts:

Beim Start wird das Form „frmAutoLogOff“ geladen. Dieses Form fragt aller 60 Sek den Zustand des Flags
aus der der Tabelle tbl_AutoLogOff ab.
Ist dieser False ändert sich nichts, ist er aber True (durch den Admin gesetzt) dann wird das
Form „frmAutoLogOffMsgBox“ in allen FE’s geladen, das den User darauf hinweist, das
sein Programm in 60 Sek geschlossen wird.
Private Sub Form_Timer()
  Static MsgBoxDone As Boolean
  Dim strMsg As String
  Dim AutoLogOff As Boolean
  Dim db As DATABASE, rs As Recordset
  
  AutoLogOff = False
  On Error Resume Next
  Set db = CurrentDb()
  Set rs = db.OpenRecordset("tbl_AutoLogOff", dbOpenSnapshot)
  rs.MoveFirst
  AutoLogOff = rs("LogOffFlag")
  rs.Close
  db.Close
  On Error GoTo 0
  
  If AutoLogOff Then
    If Not MsgBoxDone Then
      Beep
      DoCmd.OpenForm "frmAutoLogOffMsgBox"
      MsgBoxDone = True
    Else
      Application.Quit  'Access beenden...
    End If
  End If
End Sub

Danach muss durch den Admin der Flag wieder auf False gesetzt werden.
Natürlich können auch andere Zeiten eingstellt werden. Die Einstellung erfolgt über das Timer-Ereignis des Forms „frmAutoLogOff“

Wie kann ich das in der Praxis nutzen?
Die Tabelle tbl_AutoLogOff in das BE kopieren und mit dem FE verknüpfen.
Die Formulare frm_Flag, frmAutoLogOff und frmAutoLogOffMsgBox in das FE kopieren.
Das Form frmAutoLogOff in dem Makro Autoexec laden.

Das Form frm_Flag für den Admin zugängig machen um den Flag zu ändern.

2. Userverwaltung und Zugang

Die Userverwalung benötigt die Tabelle tbl_User , die Abfrage qry_Filter_logon, das Modul mod_Funktionen und die
Formulare frm_User_anmelden, frm_User_Passwort_Neu, frm_PW_Return und frm_Userstamm.
Das Form frm_Start kann ein beliebiges sein.

Wie funktionierts:

Beim Start der DB wird automatisch das Formular frm_User_anmelden geladen.
Dieses Form steuert den Zugang zur DB. Das Form bezieht seine Daten aus der Tabelle tbl_User.
Folgende Felder sind enthalten. Bei Bedarf können weitere Felder hinzugefügt werden:

User_ID = Autowert

User_Kennung = Eine Kennung die mittels CRC32 Algorithmus aus Vor-und Nachname ermittelt wird.

User_Name = Vor- und Nachname des Users

User_Passwort = Ein, mittels Hash-Algorithmus, verschlüsseltes Passwort

User_Status = Hier im Bsp sind 4 Statusangaben möglich (können aber erweitert werden)
0=Admin, 1=Bearbeiter, 2=Aufsicht, 3=Gast

logon = zeigt an ob der User derzeitig in die DB eingeloggt ist

deaktiv = hier hat der Admin User auf deaktiv zu setzen (User wird im Anmeldeform nicht angezeigt.)

Die Abfrage qry_Filter_logon dient als Datenherkunft für das Startformular um den angemeldeten User anzuzeigen
und beim Schliessen den logonFlag zu löschen.
Im Modul mod_Funktionen sind einige Funktionen enthalten:

Function „atCNames“ = ermittelt den angemeldeten Systemuser.

Function „tk_Controls_Property“ = zur Manipulation von Eigenschaften mehrere Controls gleichzeitig näheres dazu hier:
Manipulation von Control-Properties in Formularen

Function „CreateKennung“ = Erstellt mittels CRC32 Algorithmus die Userkennung. Benötigt die Datei „CrypterPW.dll“

Das Formular frm_User_anmelden
Datenherkunft tbl_User
Im Kombinationsfeld „Bitte User auswählen:“ wird der User für die Anmeldung ausgewählt.
Aus Demozwecken wird der Name und die Kennung angezeigt. In der Praxis empfielt sich nur die Kennung anzuzeigen.
Nach der erfolgten Auswahl des Users wird das Textfeld für die Passwort-Eingabe freigegeben.
Nach der Eingabe des Passwortes werden die Buttons „Anmelden“ und „Passwort ändern“ freigegeben.
Erst nach einem Klick auf den jeweiligen Button wird das Passwort geprüft.
Da das Passwort mittels Hash-Algorithmus, welche nicht rekursiv arbeitet, kann die Prüfung nur dahin gehend erfolgen,
das die Eingabe ebenfalls verschlüsselt wird und beide Strings miteinander verglichen werden:

Dim PW_Crypter As String
PW_Crypter = PWCrypter.GetPasswordHash(Me!txt_PW_Eingabe)
If PW_Crypter = Me!txt_PW Then
MsgBox "Anmeldung  in Ordnung." & vbNewLine & "Sie werden weitergeleitet.", vbInformation, "Hinweis"
'...


Die gleiche Prüfung erfolgt bei dem Klick auf den Button „Passwort ändern“.
Ist das Ergebnis falsch erfolgt kein Zugang und die DB wird geschlossen.
Soll das Passwort geändert werden, öffnet sich ein 2. Anmeldeform in dem das neue Passwort 2x eingegeben werden muß.
Sind beide Eingaben identisch wird das Passwort wieder mittels Hash verschlüsselt und in die Tabelle tbl_User zurückgeschrieben.
Danach das Form schliessen und im Anmeldeform sich mit dem neuen Passwort anmelden.
Hinweis:
Eine Löschen des Passwortes von aussen würde nichts nützen, da der Laufzeitfehler 94 ausgelöst würde und der
schliesst das Programm.
Ein Auslesen aus der Tabelle und dann vielleicht reinkopieren geht auch nicht, da ja das lesbare Passwort verschlüsselt und
mit dem hinterlegten verglichen wird.
Und ein Entschlüsseln dürfte sicher nicht unmöglich aber einige Zeit dauern, wenn es so aus sieht: k¯Ú†6�¹6dßÅÍÃÀTq.

Jetzt zum zweiten Teil bei erfolgreicher Anmeldung:

Me.logon = True 
DoCmd.RunCommand acCmdSaveRecord


In der 1.Zeile „Me.logon = True wird der Logon-Status in die Tabelle tbl_User geschrieben. Dieser ermöglicht dem Admin
zu sehen wer gerade eingeloggt ist.
DoCmd.RunCommand acCmdSaveRecord ist erforderlich um den Logon-Status im Startform und die Userdaten darzustellen.

DoCmd.OpenForm "frm_Start" 
Forms!frm_Start.Requery 
Forms!frm_Start.Refresh


Hinweis:
Um zu gewährleisten das der Logon-Status nach Schliessen der DB wieder zurückgesetzt wird, ist es nicht möglich das
Form frm_Start über das Fenstermenü oder das „X“ zu schliessen.
Dieses wird ermöglicht durch eine unsichtbare Checkbox im Startform, die als Standardwert False hat.
Im Entladen-Ereignis ist folgender Code hinterlegt:

Private Sub Form_Unload(Cancel As Integer) 
    If Me!conClose = False Then Cancel = True 
End Sub


Dieser Code lässt ein Schliessen nicht zu. Erst wenn die Checkbox den Wert True hat, kann die DB geschlossen werden.
Dieses setzt natürlich voraus das, das Startform immer geöffnet sein muss.
Ein Schliessen wäre dann über den Button „Programm Beenden“ möglich.
Dieser setzt die Checkbox auf True, den Logon auf False und schliesst die DB.

Private Sub btn_exit_Click()
    Me!conClose = True
    Me!logon = False
    DoCmd.Quit
End Sub

Weiter im Anmeldecode:

If Forms!frm_Start!txt_User_Status = 0 Then
   tk_Controls_Property Forms!frm_Start.Form, "X", "Enabled", True
   Forms!frm_Start!txt_status = "Administrator"
ElseIf Forms!frm_Start!txt_User_Status = 1 Then
   tk_Controls_Property Forms!frm_Start.Form, "XY", "Enabled", True
   Forms!frm_Start!txt_status = "Bearbeiter"
ElseIf Forms!frm_Start!txt_User_Status = 2 Then
   tk_Controls_Property Forms!frm_Start.Form, "XYZ", "Enabled", True
   Forms!frm_Start!txt_status = "Aufsicht"
Else
   tk_Controls_Property Forms!frm_Start.Form, "XYZG", "Enabled", True
   Forms!frm_Start!txt_status = "Gast"
End If
DoCmd.Close acForm, "frm_User_anmelden"



Zuerst wird das Feld „Status“ im Startform gefüllt durch die If...Else Schleife.
Sollen andere oder zusätzliche Bezeichnungen eingefügt werden, muss dieser Codeteil angepasst werden.
Der Aufruf der der Funktion „tk_Controls_Property” bewirkt die Freischaltung der jeweiligen Buttons aufgrund
des Status des eingeloggten Users.
Genauere Erläuterungen zur Funktionsweise gibt es hier: Manipulation von Control-Properties in Formularen

und würde den Rahmen hier sprengen. Nur kurz zur Erläuterung.
Alle anderen Argumente der Funktion bitte auf der Website nachschlagen.
Die Buttons oder andere Controls, die nur der Admin benutzen kann, erhalten die Marke(Tag) „X“
Für Bearbeiter lautet die Marke „XY“
Für Aufsichten lautet die Marke „XYZ“
Und für Gäste lautet die Marke „XYZG“
Da die Funktion mittels „Instr“-Funktion prüft ob der String in der Marke enthalten ist, würde sich folgende Möglichen ergeben:

Admins könnten alle Buttons benutzen die als Marke „X“, „XY“, „XYZ“ und „XYZG“ enthalten, da hier überall ein „X“
enthalten ist, deshalb:

tk_Controls_Property Forms!frm_Start.Form, "X", "Enabled", True

Bearbeiter könnten nur die Buttons benutzen die als Marke „XY“, „XYZ“ und „XYZG“ enthalten, da hier überall ein „XY“
enthalten ist, deshalb:

tk_Controls_Property Forms!frm_Start.Form, "X", "Enabled", True

Aufsichten könnten nur die Buttons benutzen die als Marke „XYZ“ und „XYZG“ enthalten, da hier überall ein „XYZ“
enthalten ist, deshalb:

tk_Controls_Property Forms!frm_Start.Form, "XYZ", "Enabled", True

Gäste könnten nur die Buttons benutzen die als Marke „XYZG“ enthalten, da hier überall ein „XYZG“
enthalten ist, deshalb:

tk_Controls_Property Forms!frm_Start.Form, "XYZG", "Enabled", True

Am Ende wird noch das Anmeldeform geschlossen:

DoCmd.Close acForm, "frm_User_anmelden"

Das Formular frm_Start bedarf keiner großen Erklärungen, da es nur zur Demonstration enthalten ist.
Es ist beliebig anpassbar, da die Grundeinstellungen hierfür schon im Form frm_User_anmelden getätigt wurden.
Das Feld „aktueller System User“ enthält den angemeldeten SystemUser und wird von der Funktion „atCNames()“ ermittelt.
Dient aber nur zur Information.
Im Feld „angemeldeter User“ ist der angemeldete User enthalten. Datenquelle ist die Abfrage qry_Filter_logon.
Die Herkunft für das Feld „Status“ wurde schon weiter oben behandelt.
Je nach Status erfolgt die Freigabe der angezeigten Buttons. Wobei hier in der Bsp-DB nur die Buttons “DB Log Off Flag“
(Funktion wurde oben behandelt) und der Button „Stammdaten User“ ein Funktion haben.
Alle anderen sind nur zu Demonstration der Rechtevergabe enthalten.

Rechtevergabe und Marke (Tag) der Buttons:

Bezeichnung des Buttons

Stammdaten User

DB Log Off Flag

Stammdaten Mitarbeiter

Tagesdaten

Testdaten

Marke(Tag)

X

X

XY

XYZ

XYZG

Rechte für:

Admins

Admins

Admins, Mitarbeiter

Admins, Mitarbeiter, Aufsichten

Admins, Mitarbeiter, Aufsichten und Gäste

Kommen wir jetzt zum Formular frm_Userstamm. Hier hat der Admin die Möglichkeit neuer User anzulegen,
zu deaktivieren (nicht löschen) oder Passwörter zurück zusetzen.

Erklärung der einzelnen Funktionen:

1. User-Passwort zurücksetzen
Der Admin hat zur keiner Zeit die Möglichkeit das Passwort eines User auszulesen, da die Hash-Verschlüsselung hier nicht rekursiv
arbeitet. Hat ein User sein Passwort vergessen, kann der Admin nur das Passwort auf einen Standardwert zurücksetzen.
Danach muss der User sofort das Standardpasswort ändern.
Im Form frm_Userstamm wählt der Admin den betreffenden User aus, mit einem Klick auf den Button „PW zurück setzen“
wird das Form frm_PW_Return kurz ausgeblendet aufgerufen und das Passwort zurückgesetzt.
So erfolgt die Rücksetzung:

Dim PWCrypter As New clsCryptPassword
Private Sub Form_Load()
    Me!txt_User_Passwort = PWCrypter.GetPasswordHash("start")
    DoCmd.RunCommand acCmdSaveRecord
    MsgBox "Passwort wurde erfolgreich zurückgesetzt", vbInformation + vbOKOnly, "PW zurückgesetzt"
    DoCmd.Close acForm, "frm_PW_Return"
End Sub

 

Im Load-Ergeinis des Forms frm_PW_Return wird der obige Code ausgeführt, wobei natürlich das neue Passwort (hier „start“)
beliebig festgelegt werden kann.

2. User deaktivieren
Es besteht nicht die Möglichkeit User zu löschen sondern nur zu deaktivieren. Deaktive User sind nicht mehr im Anmeldeform
sichtbar. Ist sicherlich nicht immer erwünscht. Sollen User gelöscht werden, dann müsste der Punkt „Löschen zulassen“ im Form
frm_Userstamm aktiviert werden. Das kann jeder halten wir er will.

3. User anlegen
Wenn ein User neu angelegt werden soll, ist es nur erforderlich den Usernamen und den Status zu setzen.
Als Start-Passwort wird hier „start“ automatisch vorgeben und verschlüsselt. Die Userkennung wird nach einem weiteren
Verschlüsselungsalgorithmus, aus der CrypterPW.dll berechnet. Die Berechnung erfolgt aus dem Usernamen.

Private Sub txt_User_Name_AfterUpdate()
  Me.txt_User_Kennung = CreateKennung(Me.txt_User_Name)
End Sub


Es besteht aber die Gefahr, das User den gleichen Vor- und Nachnamen haben, dann käme es zur Vergabe der gleichen Kennung.
In diesem Fall müsste die UserId mit einbezogen werden. Da dieses Feld ein Autowert ist, dürfte es zu keinen
Dopplungen mehr kommen.

Private Sub txt_User_Name_AfterUpdate()
  Me.txt_User_Kennung = CreateKennung(Me.txt_User_ID & Me.txt_User_Name)
End Sub


Wie kann ich das in der Praxis nutzen?

Die Tabelle tbl_User in das BE kopieren und mit dem FE verknüpfen.
Die Abfrage qry_Filter_logon und die Formulare frm_User_anmelden, frm_User_Passwort_Neu, frm_PW_Return
und frm_Userstamm und das Modul mod_Funktionen in das FE kopieren.
Außerdem wird ein Startformular benötigt das ähnlich dem in der Bsp-DB gelagert ist, zumindest in Funktionalität.


Die CrypterPW.dll muss per Verweis in das FE eingebunden werden.
Auf einem anderen Rechner ist diese DLL auch mittels Regserv32 zu registrieren.

Zusammenfassung

Diese Bsp-DB erhebt nicht den Anspruch auf Vollständigkeit und auch nicht vollständige Sicherheit, aber sie zeigt vielleicht
eine Möglichkeit, eine einfache Userverwaltung und daraus abgeleitete Rechte zu verwenden.
Es gäbe auch die Möglichkeit das Ganze zu erweitern, z.B. im Sinne von Formularrechten wie Bearbeiten, Löschen oder Anfügen
je nach Status.

 

Dateien:
(0 Stimmen)

Beispiel-DB für eine Userverwaltung mit verschlüsselten Passwörtern und verschiedenen Rechten

ab A00

Die Setup-Datei enthält eine Version ab A00

Datum 05.02.2018
Dateigröße 447.97 KB
Download 4.336

Ähnliche Artikel

Kommentar schreiben

Sicherheitscode
Aktualisieren

Login Form

1.png1.png9.png3.png2.png6.png5.png
Heute81
Gestern57
Diese Woche194
Dieser Monat1324
Total1193265

  • IP: 54.80.81.223
  • Browser: Unknown
  • Version:
  • OS: Unknown

Online

1
Online

23. Mai 2018