Berechtigungen für Access-Objekte per SQL Server III: Anwenden

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Im Beitrag „Berechtigungen für Access-Objekte per SQL Server I: Tabellen“ haben wir ein Datenmodell entwickelt für die Verwaltung der Berechtigungen verschiedener Benutzergruppen auf die Formulare, Berichte und Steuer-elemente einer Access-Anwendung – gesteuert über die jeweilige Anmeldung an der SQL Server-Datenbank. Im zweiten Teil dieser Beitragsreihe haben wir das Formular zum Einstellen der Berechtigungen erstellt. Im dritten Teil zeigen wir nun, wie wir die gespeicherten Berechtigungen nutzen, um Formulare und Steuer-elemente vor dem unbefugten Zugriff zu schützen.

Berechtigungen anwenden

Damit ist der erste Teil abgeschlossen – wir haben eine Möglichkeit geschaffen, mit der wir die Formulare einer Anwendung und die enthaltenen Steuer-elemente einlesen können. Außerdem können wir die Benutzergruppen, die am SQL Server in Form von Anmeldungen vorliegen, ermitteln und für die Kombination aus Elementen und Benutzergruppen eine der drei Berechtigungsstufen Keine, Lesen oder Alle einstellen. Nun ändert dies allein noch nichts im Umgang mit den Elementen der Benutzeroberfläche, denn noch wissen diese ja nichts davon, dass der Zugriff auf die jeweiligen Formulare oder Steuer-elemente gegebenenfalls eingeschränkt ist. Die Interpretation der drei Berechtigungsstufen sieht für Formulare wie folgt aus:

  • Keine: Das Formular darf nicht geöffnet werden.
  • Lesen: Das Formular darf geöffnet werden, aber nur zum Lesen von Daten.
  • Alle: Das Formular darf geöffnet und auch zum ändern, Anlegen oder Löschen von Daten verwendet werden.

Für die Steuer-elemente sollen die drei so auswirken:

  • Keine: Das Steuer-element ist deaktiviert.
  • Lesen, Alle: Das Steuer-element ist aktiviert.

Um ein Formular und seine Steuer-elemente mit den entsprechenden Werten für die betroffenen Eigenschaften zu versehen, benötigen wir noch ein wenig Code. Die Hauptfunktion dabei heißt BerechtigungenAnwenden und erwartet einen Verweis auf das zu öffnende Formular als Parameter. Diese Prozedur erläutern wir weiter unten. Bevor Sie diese Prozedur nutzen können, sind nämlich noch einige Vorbereitungen nötig – siehe weiter unten.

Berechtigungen ermitteln per gespeicherter Prozedur

Die Prozedur verwendet die Funktion SPRecordsetMitParameter (siehe weiter unten), um eine gespeicherte Prozedur in der SQL Server-Datenbank auszuführen und ein darauf basierendes Recordset zu erstellen. Diese gespeicherte Prozedur müssen wir zunächst anlegen, und zwar wahlweise im SQL Server Management Studio oder im Formular frm-SQL-Befehle, das wir im Beitrag SQL Server Tools vorgestellt haben (www.access-im-unternehmen.de/1061).

Anschließend steht diese gespeicherte Prozedur für die Verwendung in der Datenbank Suedsturm_SQL zur Verfügung. Sie können diese ausprobieren, werden aber gegebenenfalls keinen Datensatz als Ergebnis erhalten. Wenn Sie die im zweiten Teil dieser Beitragsreihe erstellten Beispielberechtigungen für das Formular frmIntro für die beiden Gruppen Bestellannahme und Management testen wollen, sollten Sie sich bewusst sein, unter welchem Benutzerkonto Sie gerade am Windows-Rechner angemeldet sind und ob dieses Benutzerkonto einer dieser beiden Gruppen zugehört. Falls ja, werden Sie einen entsprechenden Datensatz erhalten, den wir uns gleich ansehen werden. Falls nicht, müssen wir zunächst die Voraussetzungen schaffen, damit Sie sich unter einer der beiden Benutzergruppen an der SQL Server-Datenbank anmelden. Dazu gibt es wiederum zwei Möglichkeiten:

  • Sie melden sich unter einem geeigneten Benutzerkonto am System an oder
  • Sie starten die Access-Anwendung im Kontext des gewünschten Benutzerkontos.

Wir wollen testweise, sofern noch nicht vorhanden, die Benutzergruppe Management mit dem Benutzer Peter Gross und die Benutzergruppe Bestellannahme mit dem Benutzer Harry Klein anlegen. Das erledigen Sie über die Eingabeaufforderung ganz schnell mit den folgenden Anweisungen. Die Benutzerkonten fügen Sie so hinzu:

net user /add "Peter Gross"
net user /add "Harry Klein"

Die Gruppen legen Sie so an:

net localgroup /add Bestellannahme
net localgroup /add Management

Schließlich fügen Sie die Benutzer noch den Gruppen hinzu:

net localgroup Management /add "Peter Gross"
net localgroup Bestellannahme /add "Harry Klein"

Dass die Gruppen und Benutzer angelegt wurden, können Sie auch prüfen. Geben Sie den folgenden Befehl ein, um alle Benutzer auszugeben:

net user

Mit dem nächsten Befehl geben Sie alle Benutzergruppen aus:

net localgroup

Wenn Sie die Details einer Gruppe inklusive Benutzer ermitteln wollen, gelingt dies durch Angabe des Gruppennamens:

net localgroup Management

Und auch über die Benutzerdetails können Sie die Gruppenzugehörigkeit ermitteln:

net user "Peter Gross"

Damit haben Sie die passenden Benutzerkonten und Benutzergruppen für die folgenden Experimente erstellt.

Außerdem müssen wir die Benutzergruppen noch als neue Anmeldung zum SQL Server hinzufügen. Das erledigen wir im SQL Server Management Studio, indem wir mit der rechten Maustaste auf das Element >Servername<|Si-cher-heit|An-meldungen klicken und den Kontextmenü-Eintrag Neue Anmeldung betätigen.

Es erscheint der Dialog Anmeldung – Neu. Hier klicken Sie neben dem Feld Anmeldename auf die Schaltfläche Suchen. Im nächsten Dialog Benutzer oder Gruppe auswählen klicken Sie zunächst auf Objekttypen. Im Dialog Objekttypen aktivieren Sie, sofern noch nicht geschehen, den Eintrag Gruppen und schließen den Dialog wieder.

Dann klicken Sie im Dialog Benutzer oder Gruppe auswählen auf die Schaltfläche Erweitert. Im neuen Dialog gleichen Namens klicken Sie rechts auf die Schaltfläche Jetzt suchen und wählen dann unten aus den Suchergebnissen die Gruppe Bestellannahme aus. Schließen Sie den Dialog mit OK und den aufrufenden Dialog ebenfalls, nachdem Sie sich vergewissert haben, dass unter Geben Sie die zu verwendenden Objektnamen ein die gewünschte Gruppe aufgeführt wird.

Zurück im Dialog Anmeldung – Neu wechseln Sie noch zum Bereich Benutzerzuordnung und aktivieren dort die Datenbank Sued-sturm_SQL. Dann erstellen Sie Anmeldung mit einem Klick auf OK.

Auf die gleiche Weise verfahren Sie anschließend mit der Benutzergruppe Management. Sie können auch direkt im ersten Dialog Anmeldung – Neu die Benutzergruppe in der Form >Servername<\<Gruppenname> eingeben.

Danach sollten Sie im Bereich Sicherheit|Anmeldungen die beiden neuen Anmeldungen mit den Benutzergruppen vorfinden (siehe Bild 1).

Einrichten der Benutzergruppen als SQL Server-Anmeldungen

Bild 1: Einrichten der Benutzergruppen als SQL Server-Anmeldungen

Ge-spei-cher-te Pro-ze-dur sp-Objekt-be-rech-ti-gungen erstellen

Bevor wir uns gleich im Kontext eines der beiden Benutzer Peter Gross oder Harry Klein am SQL Server anmelden, erstellen wir noch die gespeicherte Prozedur, die wir dort ausprobieren wollen. Den dazu notwendigen Code finden Sie in Listing 1 (die Erläuterung folgt weiter unten).

CREATE PROCEDURE [dbo].[spObjektberechtigungen]
     @Objekt varchar(255)
AS
SELECT
(
     SELECT COUNT(*)
     FROM dbo.tblObjekteBenutzergruppenBerechtigungen t1 INNER JOIN dbo.tblBenutzergruppen t2
     ON t1.BenutzergruppeID = t2.BenutzergruppeID
     WHERE t1.ObjektID = t4.ObjektID AND IS_MEMBER(t2.Bezeichnung) = 1
) AS AnzahlFestgelegterBerechtigungen,
(
     SELECT COUNT(*) 
     FROM dbo.tblBenutzergruppen t3 
     WHERE IS_MEMBER(t3.Bezeichnung) = 1
) AS AnzahlGruppenDesBenutzers, 
t4.ObjektID, t6.Bezeichnung, MAX(t4.BerechtigungsstufeID) AS MaxBerechtigungID 
FROM 
(
     (
          dbo.tblObjekteBenutzergruppenBerechtigungen t4 INNER JOIN dbo.tblBerechtigungsstufen t5 
        ON t4.BerechtigungsstufeID = t5.BerechtigungsstufeID
    )
    INNER JOIN dbo.tblObjekte t6 ON t4.ObjektID = t6.ObjektID
)
INNER JOIN dbo.tblBenutzergruppen t7 ON t4.BenutzergruppeID = t7.BenutzergruppeID
WHERE t6.Uebergeordnet = @Objekt
AND IS_MEMBER(t7.Bezeichnung) = 1
GROUP BY t6.Bezeichnung, t4.ObjektID;

Listing 1: Gespeicherte Prozedur, welche die Berechtigungen für den aktuellen Benutzer für das übergebene Formular ermittelt.

Um die gespeicherte Prozedur anzulegen, führen Sie den CREATE PROCEDURE-Code in einem Abfragefenster der Datenbank Suedsturm_SQL aus. Nach der Aktualisierung des Elements <Servername>|Da-ten-ban-ken|Sued-sturm_SQL|Pro-gram-mier-bar-keit|Ge-spei-cher-te Prozeduren sollte darunter ein neuer Eintrag namens spObjektberechtigungen auftauchen.

Damit die neuen Benutzergruppen nun auch noch die gespeicherte Prozedur spObjektberechtigungen nutzen können, müssen wir diesen noch die passenden Berechtigungen geben. Dazu klicken Sie mit der rechten Maustaste auf den Eintrag für diese gespeicherte Prozedur im Objekt-Explorer und wählen aus dem Kontextmenü den Eintrag Eigenschaften aus. Wechseln Sie hier zum Bereich Berechtigungen, markieren Sie nacheinander die beiden betroffenen Gruppen Management und Bestellannahme und aktivieren Sie die Option Erteilen für die Berechtigung Ausführen (siehe Bild 2).

Erteilen der Berechtigungen für die gespeicherte Prozedur

Bild 2: Erteilen der Berechtigungen für die gespeicherte Prozedur

Aufbau der gespeicherten Prozedur spObjektberechtigungen

Diese Prozedur sieht etwas kompliziert aus, aber wir lösen das jetzt auf. Der größte Teil der SELECT-Anweisung ist das Konstrukt zum Herstellen der Verknüpfungen der vier beteiligten Tabellen tblObjekteBenutzergruppenBerechtigungen, tblBerechtigungsstufen, tblObjekte und tblBenutzergruppen per INNER JOIN – das ist der Teil von FROM bis WHERE im unteren Bereich. Dies würde grundsätzlich alle Datensätze liefern, die in den vier Tabellen angelegt wurden. Da wir nur bestimmte Berechtigungen benötigen, in diesem Fall für ein spezielles Objekt, dass wir mit dem Parameter @Objekt übergeben, haben wir dafür eine Bedingung in der WHERE-Klausel festgelegt und noch ein weiteres. Die folgende Bedingung sorgt also dafür, dass wir nur die Berechtigungen für die Elemente erhalten, deren übergeordnetes Objekt das mit @Objekt übergebene Formular ist (t6 ist ein Alias für die Tabelle tblObjekte):

t6.Uebergeordnet = ''''frmIntro''''

Außerdem möchten wir nur solche Datensätze für die aktuelle Benutzergruppe zurückliefern. Dabei unterstützt uns die T-SQL-Funktion IS_MEMBER. Sie erwartet den Namen einer Anmeldung, in diesem Fall etwa die Gruppe <Servername>\Management, und prüft, ob der Benutzer, der gerade am Windows-Rechner angemeldet ist, zu dieser Gruppe gehört. t7 ist dabei ein Alias für die Tabelle tblBenutzergruppen und Bezeichnung der Name der Benutzergruppe:

IS_MEMBER(t7.Bezeichnung) = 1

Welche Werte soll die gespeicherte Prozedur nun zurückliefern Die ersten beiden Werte sind keine einfachen Werte, die aus der per INNER JOIN verknüpften Kombination der vier Tabellen stammen, sondern die Ergebnisse von Unterabfragen. Hier ist die erste Unterabfrage:

(
     SELECT COUNT(*)
     FROM dbo.tblObjekteBenutzergruppenBerechtigungen t1 
     INNER JOIN dbo.tblBenutzergruppen t2
     ON t1.BenutzergruppeID = t2.BenutzergruppeID
     WHERE t1.ObjektID = t4.ObjektID 
     AND IS_MEMBER(t2.Bezeichnung) = 1
) AS AnzahlFestgelegterBerechtigungen

Diese Abfrage bestimmt die Anzahl der Datensätze der beiden per INNER JOIN verknüpften Tabellen tblObjekteBenutzergruppenBerechtigungen und tblBenutzergruppen, wobei hier nur die Datensätze berücksichtigt werden sollen, deren ObjektID der Tabelle tblObjekteBenutzergruppenBerechtigungen auch in der gleichnamigen Tabelle der Hauptabfrage vorkommen. Da wir zweimal die gleiche Tabelle referenzieren, haben wir diesen jeweils einen Alias (hier t1 und t4) vergeben und dies auch direkt für alle referenzierten Tabellen der Haupt- und der beiden Unterabfragen erledigt. Das Ergebnis dieser Unterabfrage, das in Form des Feldes AnzahlFestgelegterBerechtigungen in der Hauptabfrage landet, entspricht der Anzahl der expliziten Berechtigungen an diesem Objekt für den aktuellen Benutzer. Wenn der Benutzer etwa in einer Benutzergruppe ist, die eine Lesen-Berechtigung für ein Formular hat, liefert AnzahlFestgelegterBedingungen den Wert 1 zurück. Ist der Benutzer in zwei Gruppen, von denen die eine Lesen-Rechte und die andere das Recht Keine hat, liefert AnzahlFestgelegterBedingungen den Wert 2. Ist der Benutzer aber in einer Gruppe, die Lesen-Rechte hat und in einer anderen Gruppe, für die keine expliziten Rechte für das Formular festgelegt sind, dann liefert AnzahlFestgelegterBedingungen den Wert 1. Wozu das dient, wird gleich deutlich.

Zunächst schauen wir uns noch die zweite Unterabfrage an. Diese lautet wie folgt:

(
     SELECT COUNT(*) 
     FROM dbo.tblBenutzergruppen t3 
     WHERE IS_MEMBER(t3.Bezeichnung) = 1
) AS AnzahlGruppenDesBenutzers

Diese Unterabfrage gibt einfach nur die Anzahl der Gruppen des Benutzers zurück. Sie zählt alle Einträge der Tabelle tblBenutzergruppen, für welche die Funktion IS_MEMBER den Wert 1 zurückgibt.

Der Sinn der beiden Unterfunktionen ist folgender: Wenn die Anzahl von AnzahlFestgelegterBerechtigungen und AnzahlGruppenDesBenutzers gleich groß sind, können wir schlussfolgern, dass für jede der Benutzergruppen des Benutzers eine explizite Berechtigung an dem jeweiligen Element festgelegt wurde. Wenn AnzahlFestgelegterBerechtigungen kleiner ist als AnzahlGruppenDesBenutzers, dann gibt es Benutzergruppen für den Benutzer, für die keine explizite Berechtigung an dem mit @Objekt übergebenen Objekt festgelegt ist. Und da wir definiert haben, dass keine explizite Berechtigung bedeutet, dass der Benutzer das Schreiben-Recht an dem Objekt erhält, wird in diesem Fall auch das Schreiben-Recht festgelegt, egal welche Rechte die anderen Benutzergruppen für den Zugriff auf dieses Objekt besitzen.

Neben diesen beiden Feldern, die aus Unterabfragen generiert werden, soll die gespeicherte Prozedur noch die Felder ObjektID der Tabelle tblObjekteBenutzergruppenBerechtigungen, Bezeichnung der Tabelle tblObjekte und den größten Wert des Feldes BerechtigungsstufeID der Tabelle tblObjekteBenutzergruppenBerechtigungen liefern.

Im Kontext eines anderen Benutzers am SQL Server anmelden

Jetzt wird es interessant – wir wollen die gespeicherte Prozedur zunächst testweise im SQL Server Management Studio ausprobieren, und zwar im Kontext verschiedener Benutzer. Uns interessiert vor allem, ob es funktioniert, die nicht expliziten Berechtigungen für Gruppen zu ermitteln.

Um das SQL Server Management Studio im Kontext eines anderen Benutzers zu öffnen, klicken Sie mit der rechten Maustaste auf das Programm SQL Server Management Studio. Dort finden Sie dann wiederum den Eintrag Microsoft SQL Server Management Studio, auf den Sie nochmals mit der rechten Maustaste klicken – diesmal allerdings bei gedrückter Umschalttaste. Dies liefert einige Kontextmenü-Einträge mehr als üblich, unter anderem Als anderer Benutzer ausführen. Es erscheint dann ein Dialog, in dem Sie den Benutzernamen und das Kennwort des gewünschten Benutzers eingeben (siehe Bild 3).

Anwendung als anderer Benutzer öffnen

Bild 3: Anwendung als anderer Benutzer öffnen

Zuerst melden wir uns als Peter Gross an, der nur der Gruppe Manager angehört. Für diese haben wir im Formular frmBerechtigungen das Recht Alle für das Formular frmIntro und das Steuer-element cmdGo festgelegt.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar