Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.
Berechtigungen für Access-Objekte per SQL Server III: Anwenden
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 Steuerelemente 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 Steuerelemente 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 Steuerelemente 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 Steuerelemente 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 Steuerelemente sollen die drei so auswirken:
- Keine: Das Steuerelement ist deaktiviert.
- Lesen, Alle: Das Steuerelement ist aktiviert.
Um ein Formular und seine Steuerelemente 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 frmSQLBefehle, 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
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 Suedsturm_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
Danach sollten Sie im Bereich Sicherheit|Anmeldungen die beiden neuen Anmeldungen mit den Benutzergruppen vorfinden (siehe Bild 1).
Bild 1: Einrichten der Benutzergruppen als SQL Server-AnmeldungenGespeicherte Prozedur spObjektberechtigungen 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
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).
Bild 2: Erteilen der Berechtigungen für die gespeicherte ProzedurAufbau 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
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.
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.