Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Anmeldung und Berechtigungen mit VBA

Begonnen von mark_k, Februar 07, 2024, 10:23:19

⏪ vorheriges - nächstes ⏩

mark_k

Hallo zusammen

eine Adress-Datenbank wurde von mir erstellt und dazu eine Benutzeranmeldung mit VBA. Es existiert eine Tabelle für "Benutzer", "Benutzergruppen" und "Berechtigungen. Die Anmeldung an sich funktioniert, allerdings funktionieren die Brechtigungen nicht, diese werden durch den User "Admin" ersetzt/übergangen, dieser User existiert aber nicht in meiner Tabelle "Benutzer", dadurch wird wohl auch die Berechtigungsstufe nicht gesetzt.
Nach erfolgreicher Anmeldung wird mir auch die korrekte Berechtigungsstufe angezeigt, also Anwender oder Administrator. Die Berechtigungen sollen Änderungen im Formular "Contact List" verhindern oder erlauben. Wenn ich dieses Formular starte mit Debugging, bekomme ich die Ausgabe:

Aktueller Benutzername: Admin
Benutzergruppen_ID:

Kann mir jemand sagen, wie ich in meiner Datenbank diesen User abschalten oder deaktivieren bzw. verhindere dass der sich "vordrängelt"? Es scheint ein Standard-User von Access zu sein?

Erstellt wurde die DB mit Access 2016

MzKlMu

Hallo,
wie genau ist die Anmeldung realisiert?
Gruß Klaus

PhilS

Zitat von: mark_k am Februar 07, 2024, 10:23:19Aktueller Benutzername: Admin
"Admin" klingt sehr danach als würdest du den Benutzer über die CurrentUser Funktion ermitteln. - Dies ist leider das alte Benutzerverwaltungssystem von Access, dass mit dem neuen .accdb Dateiformat nicht mehr funktioniert.

Wenn das so ist, solltest du nach einer alternativen Möglichkeit recherchieren. Z.B. über den Windows Benutzer.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mark_k

Hallo Klaus,

es geht hier um eine Adress-Datenbank. Realisiert habe ich das mit einer Tabelle die Adressen beinhaltet und dazu ein Formular mit Anmeldemaske.
Das Formular nennt sich "Benutzeranmeldung":
Private Sub Befehl21_Click()
   
    ' Überprüft, ob die Anmeldeinformationen korrekt eingegeben wurden.
    If Nz(Me.Benutzername, "") = "" Or Nz(Me.Passwort, "") = "" Then
        MsgBox "Bitte Benutzername und Passwort eingeben", vbExclamation, "Eingabe erforderlich"
        Me.Benutzername.SetFocus
   
    ' Anmeldeinformationen sind korrekt
    Else
   
        ' Überprüft, ob der Benutzername existiert.
        If IsNull(DLookup("Benutzername", "Benutzer", "Benutzername='" & Me.Benutzername & "'")) Then
            MsgBox "Benutzername ist nicht korrekt", vbExclamation, "Eingabe erforderlich"
            Me.Benutzername.SetFocus
         
        ' Überprüft, ob das Passwort korrekt eingegeben wurde.
        ElseIf IsNull(DLookup("Passwort", "Benutzer", "Benutzername='" & Me.Benutzername & "' AND Passwort='" & Me.Passwort & "'")) Then
            MsgBox "Passwort ist nicht korrekt", vbExclamation, "Eingabe erforderlich"
            Me.Passwort.SetFocus
         
        Else
            ' Lese die Benutzergruppen-ID aus der Tabelle "Benutzer"
            Dim BenutzergruppenID As Integer
            BenutzergruppenID = DLookup("Benutzergruppen_ID", "Benutzer", "Benutzername='" & Me.Benutzername & "'")
           
            ' Überprüfe die Berechtigungen basierend auf der Benutzergruppen-ID
            Select Case BenutzergruppenID
                Case 1 ' Administratoren
                    DoCmd.Close acForm, "Benutzeranmeldung"
                    MsgBox "Anmeldung erfolgreich als Administrator!", vbExclamation, "Anmeldung"
                    ' Öffne das Formular "Contact Start"
                    DoCmd.OpenForm "Contact Start"
                   
                Case 2 ' Anwender
                    DoCmd.Close acForm, "Benutzeranmeldung"
                    MsgBox "Anmeldung erfolgreich als Anwender!", vbExclamation, "Anmeldung"
                    ' Öffne das Formular "Contact Start" im nur-Lese-Modus
                    DoCmd.OpenForm "Contact Start", , , , acFormReadOnly
            End Select
        End If
         
    End If
             
End Sub

Private Sub Passwort_AfterUpdate()
    Befehl21_Click
End Sub

Dazu habe ich die Tabellen "Benutzer", "Benutzergruppen" und "Berechtigungen" erstellt.
Nachdem der Login durchgeführt wurde, wird automatisch das Formular geschlossen und das Formular "Contact Start" geöffnet. Hier wird dann über die Schaltfläche "Befehl16" das Formular "Contact List" geöffnet, das mit der Tabelle "Contact" verknüpft ist:
Private Sub Befehl16_Click()
    ' Überprüfe den aktuellen Benutzernamen
    Debug.Print "Aktueller Benutzername: " & CurrentUser()

    ' Überprüfe die Benutzergruppen-ID des aktuellen Benutzers
    Dim BenutzergruppenID As Variant
    BenutzergruppenID = DLookup("Benutzergruppen_ID", "Benutzer", "Benutzername='" & CurrentUser() & "'")
    Debug.Print "Benutzergruppen_ID: " & BenutzergruppenID

    ' Überprüfe, ob der Benutzer ein Administrator ist
    If Not IsNull(BenutzergruppenID) Then
        ' Überprüfe die Berechtigung für das Formular "Contact List"
        If CheckBerechtigung(CLng(BenutzergruppenID), "Contact List") Then
            ' Der Benutzer hat die Berechtigung, öffne das Formular "Contact List"
            DoCmd.OpenForm "Contact List"
        Else
            ' Der Benutzer hat keine Berechtigung, zeige eine Meldung
            MsgBox "Sie haben keine Berechtigung, dieses Formular zu öffnen.", vbExclamation, "Berechtigungsfehler"
        End If
    Else
        ' Falls die Benutzergruppen-ID nicht gefunden wird, zeige eine Meldung
        MsgBox "Benutzer nicht gefunden.", vbExclamation, "Berechtigungsfehler"
    End If
End Sub

Function CheckBerechtigung(BenutzergruppenID As Long, Formularname As String) As Boolean
    ' Überprüfe die Berechtigung für das Formular
    Dim BerechtigungsLevel As Variant
    BerechtigungsLevel = DLookup("BerechtigungsLevel", "Berechtigungen", "Benutzergruppen_ID=" & BenutzergruppenID & " AND Formularname='" & Formularname & "'")

    ' Gib TRUE zurück, wenn der Benutzer die Berechtigung hat
    CheckBerechtigung = (Not IsNull(BerechtigungsLevel) And BerechtigungsLevel = "Lesen")
End Function

Der Inhalt der Tabelle "Contacts" soll über das Formular "Contact List" angepasst werden können, allerdings nur von Administratoren, Anwender dürfen keine Änderungen vornehmen.

@PhilS 
Hallo Phil, über den Windows Benutzer wäre eine super Sache, wie müsste das denn aussehen?

Noch vor drei Monaten hatte ich keine Ahnung von Access und VBA, die habe ich mir alles im Selbststudium beigebracht, denke man kann hier von erweiterten Grundkenntnissen sprechen. Die Beiträge im Forum hier hatten mir sehr geholfen.  :)

MzKlMu

Hallo,
wo kommt denn der Benutzername her ?
Gruß Klaus

mark_k

Aus der Tabelle "Benutzer".
Tabelle:
Benutzer_ID
Benutzername
Passwort
Benutzergruppen_ID

Tabelle Benutzergruppen:
Benutzergruppen_ID
Benutzergruppenname

Tabelle Berechtigungen:
Berechtigungs_ID
Benutzergruppen_ID
Formularname
Berechtigungslevel

Beziehungen auf Benuzergruppen_ID ist gesetzt.

Die Anmeldung an sich funktioniert, das Formular "Benutzeranmeldung" wird geschlossen und die Berechtigung "Anwender" oder "Administration" korrekt in einem Popup angezeigt, die Anmeldung funktioniert also, nur die greifen die Berechtiungen nicht.

PhilS hatte ja geschrieben, dass es wohl an der Version liegt, warum sich der "Admin" vordrängelt.

PhilS

Zitat von: mark_k am Februar 08, 2024, 12:02:01PhilS hatte ja geschrieben, dass es wohl an der Version liegt, warum sich der "Admin" vordrängelt.
Jein.
Das Kernproblem ist, dass du selbst deine eigene Benutzerverwaltung gebaut hast, dann aber in deinem Code trotzdem die eingebaute CurrentUser-Funktion von Access/JET/ACE verwendest, die mit deiner eigenen Benutzerverwaltung absolut nichts zu tun hat und somit einen völlig anderen Benutzernamen (Admin) liefert.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mark_k

Hallo Phil,
vielen Dank für Deine Erklärung.
Mit "Environ("USERNAME")" habe ich es auch getstet, aber leider ohne Erfolg, Angemeldet ist immer "Admin".
Hättest Du vielleicht eine Idee, wie ich das lösen könnte? Oder ist mein Code schon mit Denkfehlern belegt?

PhilS

Zitat von: mark_k am Februar 09, 2024, 14:22:38Angemeldet ist immer "Admin".
Hättest Du vielleicht eine Idee, wie ich das lösen könnte? Oder ist mein Code schon mit Denkfehlern belegt?
Ja, dein Code ist mit Denkfehlern belegt. Das hatte ich dir bereits in jedem vorigen Beitrag hier in diesem Thread geschrieben.
Du verwendest die CurrentUser-Funktion des obsoleten Access-Sicherheitssystems. Diese Funktion wird in einer .accdb-Datei immer den Standard-Benutzer "Admin" ermitteln.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mark_k

#9

Das habe ich schon verstanden, aber wie wäre der Lösungsansatz in meinem Code?

PhilS

Zitat von: mark_k am Februar 10, 2024, 09:12:16Das habe ich schon verstanden, aber wie wäre der Lösungsansatz in meinem Code?
In deinem Code brauchst du eine Funktion, die dir den Benutzernamen basierend auf deiner eigenen Implementierung der Benutzerverwaltung liefert.
Bei der Verwendung von Windows Accounts wäre das schon: Environ("USERNAME")
Die Funktion kannst du auch in eine eigene Funktion verpacken:

Public Function AktuellerBenutzername As String
    AktuellerBenutzername  =  [size=3][font=Courier New]Environ("USERNAME") [/font][/size]
End Function

Analog müsstest du bei deinem eigenen, nicht Windows basierenden, Benutzerverwaltung vorgehen. Du schreibst eine Funktion, die den aktuellen Benutzer aus deinem Anmeldeprozess liefert.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mark_k

Ich habe es mit Environ("USERNAME") umgesetzt und es funktioniert jetzt.
Dazu habe ich noch ein Textfeld erstellt, dass bei der Anmeldung den aktuell angemeldeten Anwender mit seiner Berechtigung anzeigt.

Vielen Dank!  :)