Access hat kein eingebautes Rechtemodell
Wenn Du eine Access-Datenbank baust, kannst Du keine Benutzerrollen definieren.
Kein „nur lesen“, kein „nur eigene Datensätze“.
Standardmäßig können alle alles – löschen, ändern, Export machen.
In kleinen Teams wird das gern ignoriert.
Aber spätestens, wenn jemand versehentlich 1000 Zeilen löscht, wird’s unlustig.
Mein Konzept: Rollen-Logik per VBA selbst umsetzen
Ich baue mir das Rechtemodell selbst – mit einfacher Benutzerverwaltung.
Nicht bulletproof, aber in der Praxis solide.
Rollen und Benutzer in Tabelle speichern
Beispiel: Zwei Tabellen
tblBenutzer
Benutzername | Rolle |
---|---|
max | admin |
lisa | leser |
tom | erfasser |
tblRollen
Rolle | DarfLesen | DarfSchreiben | DarfLöschen |
---|---|---|---|
admin | Ja | Ja | Ja |
leser | Ja | Nein | Nein |
erfasser | Ja | Ja | Nein |
Benutzername aus Windows ziehen
Ich hole den Windows-Benutzernamen automatisch beim Start.
Function HoleBenutzername() As String
HoleBenutzername = Environ("USERNAME")
End Function
Rolle des aktuellen Nutzers laden
Function HoleRolle() As String
Dim sBenutzer As String
sBenutzer = HoleBenutzername()
HoleRolle = Nz(DLookup("Rolle", "tblBenutzer", "Benutzername='" & sBenutzer & "'"), "")
End Function
Berechtigungen bei Formularstart prüfen
Beim Öffnen eines Formulars steuere ich die Rechte:
Private Sub Form_Load()
Dim rolle As String
rolle = HoleRolle()
If Not Darf(rolle, "DarfSchreiben") Then
Me.AllowEdits = False
End If
If Not Darf(rolle, "DarfLöschen") Then
Me.AllowDeletions = False
End If
End Sub
Funktion: Darf()
Function Darf(rolle As String, rechtefeld As String) As Boolean
Darf = (Nz(DLookup(rechtefeld, "tblRollen", "Rolle='" & rolle & "'"), "Nein") = "Ja")
End Function
Steuerelemente gezielt sperren
Manche Felder sollen schreibgeschützt bleiben.
Auch das mache ich beim Laden:
If Not Darf(rolle, "DarfSchreiben") Then
Me.txtPreis.Enabled = False
Me.txtPreis.Locked = True
End If
Menü- und Ribbonsteuerung anpassen
Für Admins andere Buttons als für Leser?
Einfach – über unsichtbare Steuerelemente:
If HoleRolle() <> "admin" Then
Me.cmdDatenExportieren.Visible = False
End If
Navigation einschränken
Leser sehen nur bestimmte Formulare.
Ich nutze dafür ein Startmenü mit bedingter Sichtbarkeit.
Me.btnVerwaltung.Visible = (HoleRolle() = "admin")
CRUD-Logik über zentralen Code steuern
Beim Speichern oder Löschen prüfe ich immer die Rolle.
Nicht nur in der Oberfläche.
Beispiel: Löschversuch abfangen
Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
If Not Darf(HoleRolle(), "DarfLöschen") Then
MsgBox "Du darfst keine Datensätze löschen.", vbExclamation
Cancel = True
End If
End Sub
Logging bei Regelverletzung
Wenn jemand versucht, trotz Einschränkung etwas zu tun, logge ich das.
Sub LogRechteVerstoß(aktion As String)
Dim sSQL As String
sSQL = "INSERT INTO tblLog (Benutzer, Zeit, Aktion) VALUES " & _
"('" & HoleBenutzername() & "', Now(), '" & aktion & "')"
CurrentDb.Execute sSQL, dbFailOnError
End Sub
Mein Fazit
„Alle dürfen alles“ ist bequem – aber gefährlich.
Ich baue das Rechtemodell lieber selber – pragmatisch, per VBA.
Besser als blind vertrauen.
No responses yet