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

BenutzernameRolle
maxadmin
lisaleser
tomerfasser

tblRollen

RolleDarfLesenDarfSchreibenDarfLöschen
adminJaJaJa
leserJaNeinNein
erfasserJaJaNein

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.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert