Berechtigungsgesteuertes Reporting mit kombinierten Zugriffskonzepten aus beiden Welten: Access vs. WordPress

Warum das Thema spannend ist

WordPress kennt Rollen wie Editor, Author, Subscriber.
Access kennt Benutzergruppen, Berechtigungsabfragen und Formulare mit Kennwortabfragen.
Beide Systeme haben StĂ€rken. Aber getrennt bringen sie wenig, wenn’s ums Reporting geht.
Ich zeige Dir, wie ich Rechte aus beiden Welten zusammenfĂŒhre. Und daraus ein sauberes, nutzerabhĂ€ngiges Reporting baue.

1. Zugriffsmodell definieren

Ich trenne grundsÀtzlich:

  • Technische Authentifizierung (Wer bist Du?)
  • Fachliche Berechtigung (Was darfst Du sehen?)

Die Authentifizierung kann z. B. ĂŒber WordPress-Login laufen.
Die fachliche Berechtigung liegt dann in Access.

Beispiel:

NutzerWP-RolleAccess-RolleSichtbare Daten
AnnasubscriberVertriebeigene Kunden
BerndeditorManagementalle Kunden, UmsÀtze
CarosubscriberSupportTickets, keine UmsÀtze

2. WordPress: Rollen exportieren per REST

In WordPress baue ich mir einen Endpunkt, der die Rollen liefert:

add_action('rest_api_init', function () {
    register_rest_route('intern/v1', '/userrole/(?P<email>[a-zA-Z0-9@._-]+)/', [
        'methods' => 'GET',
        'callback' => 'rolle_ermitteln',
        'permission_callback' => '__return_true'
    ]);
});

function rolle_ermitteln($data) {
    $user = get_user_by('email', $data['email']);
    if (!$user) return ['rolle' => 'none'];
    return ['rolle' => implode(',', $user->roles)];
}

Dann in Access:

Function ErmittleWordPressRolle(email As String) As String
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    http.Open "GET", "https://deinshop.de/wp-json/intern/v1/userrole/" & email, False
    http.Send

    If http.Status = 200 Then
        Dim js As Object
        Set js = JsonConverter.ParseJson(http.ResponseText)
        ErmittleWordPressRolle = js("rolle")
    Else
        ErmittleWordPressRolle = "unknown"
    End If
End Function

3. Access: Benutzerrolle lokal speichern

Ich speichere bei Sessionstart die WordPress-Rolle in einer Temp-Tabelle:

Sub InitialisiereBenutzerSession(email As String)
    Dim rolle As String
    rolle = ErmittleWordPressRolle(email)
    CurrentDb.Execute "DELETE FROM tblSession"
    CurrentDb.Execute "INSERT INTO tblSession (email, rolle_wp) VALUES ('" & email & "', '" & rolle & "')"
End Sub

Diese tblSession nutze ich spÀter in Abfragen:

SELECT * FROM kunden
WHERE (
    EXISTS (
        SELECT * FROM tblSession 
        WHERE rolle_wp LIKE '*management*'
    )
    OR kundenbetreuer_email = (SELECT email FROM tblSession)
)

4. Erweiterung: Access-interne Rollen + Mapping

Ich kombiniere WordPress-Rollen mit Access-internen Regeln:

WP-RolleAccess-RolleSichtbarkeit
subscriberVertriebnur eigene Kunden
editorManagementalle Kunden
authorSupportTickets, keine UmsÀtze

Diese Tabelle tblRollenMapping pflege ich im Backend.
Dann mache ich ein JOIN im Code:

Function ErmittleAccessRolle(wpRolle As String) As String
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT access_rolle FROM tblRollenMapping WHERE wp_rolle = '" & wpRolle & "'")
    If Not rs.EOF Then
        ErmittleAccessRolle = rs!access_rolle
    Else
        ErmittleAccessRolle = "none"
    End If
    rs.Close
End Function

5. Reporting: Sichtbarkeit steuern per Query

Alle Berichte greifen auf Abfragen zurĂŒck, die die Session-Tabelle und Berechtigung prĂŒfen.

Beispiel: Umsatz nach Benutzerrolle

SELECT k.kundennr, k.name, u.umsatz
FROM kunden k
LEFT JOIN umsaetze u ON k.kundennr = u.kundennr
WHERE (
    SELECT access_rolle FROM tblSession
) IN ('Management', 'Vertrieb')
AND (
    SELECT access_rolle FROM tblSession
) <> 'Support'

6. Formularlogik bei eingeschrÀnktem Zugriff

Wenn nur ein Teil sichtbar ist, baue ich gezielt reduzierte Formulare.

Beispiel: Kundenformular nur mit Betreuernummer

Me.RecordSource = "SELECT * FROM kunden WHERE kundenbetreuer_email = '" & AktuellerBenutzer & "'"

Oder Umsatzzahlen ausblenden:

If Benutzerrolle = "Support" Then
    Me.txtUmsatz.Visible = False
    Me.lblUmsatz.Visible = False
End If

7. Logging nicht vergessen

Ich protokolliere, wer wann auf was zugegriffen hat:

Sub LogZugriff(modul As String, datensatzID As Long)
    CurrentDb.Execute "INSERT INTO zugriffslog (zeitpunkt, benutzer, modul, datensatz_id) " & _
                      "VALUES (Now(), '" & AktuellerBenutzer & "', '" & modul & "', " & datensatzID & ")"
End Sub

Das hilft bei Nachvollziehbarkeit – und bei RĂŒckfragen vom Chef.

Mein gemischtes Fazit

WordPress bringt die Authentifizierung.
Access bringt die fachliche Berechtigung.
Kombiniert bekommst Du eine skalierbare, rollenbasierte Reporting-Struktur – auch ohne Azure AD oder LDAP.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

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