Anzeige von Feldern gezielt schützen

Datenbank

Über das Menü EXTRAS-SICHERHEIT- BENUTZER UND GRUPPENBERECHTIGUNGEN (Access 2003, 2002/XP und 2000) bzw. EXTRASZUGRIFFSRECHTEBENUTZER- UND GRUPPENBERECHTIGUNGEN (Access 97) können Sie Zugriffsrechte für einzelne Objekte wie Tabellen, Formulare oder Berichte setzen und so beispielsweise erreichen, dass Anwender sensible Daten über Formulare nicht einsehen oder nur die für sie gedachten Auswertungen abrufen können. So lässt sich z.B. für ein Formular steuern, dass es vom Anwender „Müller“ geöffnet werden darf, vom Anwender „Schmidt“ aber nicht.

Es gibt jedoch verschiedene Anwendungsbereiche, in denen dieses strikte „Ja/Nein“- Konzept nicht praktikabel ist: In einer Artikelverwaltung können beispielsweise neben den Feldern für die Basisdaten spezielle Felder vorhanden sein, über die sensible Daten wie Einkaufsrabatte, Handelspannen oder Verkaufspreise verwaltet werden. Diese Informationen müssen zwar dem Sachbearbeiter für seine tägliche Arbeit zugänglich sein, sollen aber der zur Erfassung von Wareneingängen abgestellten Aushilfe verborgen bleiben. Hier bleibt in der Regel nur der Ausweg, zwei Formulare einzusetzen. Dieser Aufwand lässt sich jedoch recht einfach vermeiden. Das grundsätzliche Konzept sieht folgendermaßen aus:

— In der Eigenschaft „Marke“ (VBA: Tag) der Felder und Steuerelemente Ihres Formulars geben Sie eine Liste der Anwender vor, die die einzelnen Felder bearbeiten dürfen. Also zum Beispiel:

;Admin;Müller;Schmidt;

— Beim Laden des Formulars wird eine Funktion ausgeführt, die zunächst den aktuellen Anwendernamen wie zum Beispiel „Schmidt“ ermittelt.

— In einer Schleife werden dann alle Felder und Steuerelemente des Formulars geprüft: Befindet sich der Name des aktuellen Anwenders nicht in der Eigenschaft „Marke“, wird das entsprechende Feld oder Steuerelement ausgeblendet. Das Ergebnis ist dann ein Formular, das nur die Felder anzeigt, die für den jeweiligen Anwender bestimmt sind.

Um eine solche Lösung in Ihrer Datenbank einzusetzen, gehen Sie wie folgt vor:

1. Wir haben für Sie eine Beispieldatenbank vorbereitet, in der wir diese Technik bereits umgesetzt haben.

Übertragen Sie das Modul „modSecureForms“ aus der Beispieldatei in Ihre Datenbank.

2. Öffnen Sie das Formular im Entwurfsmodus.

3. Versehen Sie zunächst alle Felder und Steuerelemente mit der oben erwähnten „Namensliste“.

Bitte achten Sie darauf, dass sowohl am Anfang als auch am Ende sowie zwischen den Namen jeweils ein Semikolon angegeben ist. Andernfalls kann ein Name eventuell nicht korrekt erkannt werden. Außerdem müssen Sie darauf achten, dass auch Bezeichnungsfelder von Textfeldern und anderen Steuerelementen über die Eigenschaft „Marke“ zu kennzeichnen sind. Bei allgemeingültigen Steuerelementen wie z. B. einer Formularbezeichnung im Formularkopf oder Schaltflächen im Formularfuß lassen Sie die Eigenschaft „Marke“ einfach leer.

 

4. Stellen Sie die Eigenschaft „Beim Laden“ des Formulars auf den Eintrag „[Ereignisprozedur]“ ein, klicken Sie auf die Schaltfläche mit den drei Punkten und geben Sie die folgende Anweisung ein:

Private Sub Form_Load()
FelderEinAus Me, btnFertig
End Sub

Diese Anweisung ruft die Prozedur „Felder- EinAus“ im Modul „modSecureForms“ auf. Als Parameter sind einmal eine Referenz auf das zu behandelnde Formular sowie ein Steuerelement des Formulars anzugeben, das nicht ausgeblendet wird.

Da Access beim Öffnen eines Formulars den Fokus immer auf das erste Textfeld im Formular setzt, dieses aber eventuell ausgeblendet werden muss, wird der Fokus zum Beispiel auf eine Schaltfläche „btnFertig“ gesetzt, um einen Laufzeitfehler beim Ausblenden eines aktivierten Feldes zu vermeiden.

Die Prozedur „FelderEinAus“ arbeitet wie folgt:

Sub FelderEinAus(F As Form, C As Control)
Dim strUser As String
Dim ctl As Control
C.SetFocus

Hier wird zunächst der Fokus aus den eben erläuterten Gründen zum Beispiel auf eine Schaltfläche „btnFertig“ gesetzt, die als Parameter „C“ übergeben wurde.

strUser = CurrentUser()

Über die Funktion „CurrentUser()“ ermitteln wir den Anmeldenamen des aktuellen Anwenders.

For Each ctl In F.Controls
If ctl.Tag <> „“ Then
ctl.Visible = (InStr(ctl.Tag, „;“ & strUser & „;“) <> 0)
End If
Next
End Sub

In einer Schleife werden dann alle Felder und Steuerelemente des Formulars mithilfe der Funktion „InStr()“ daraufhin geprüft, ob der aktuelle Anmeldename (mit führendem und abschließendem Semikolon) in der Eigenschaft „Marke“ enthalten ist. Das Ergebnis der Prüfung weisen wir direkt der Eigenschaft „Visible“ (sichtbar) des jeweiligen Feldes oder Steuerelementes zu, sodass Felder, bei denen der aktuelle Name nicht in „Marke“ vermerkt ist, ausgeblendet werden.

Sichern Sie die Änderungen und lassen Sie das Formular anzeigen.Wie gewünscht werden daraufhin nur noch die erlaubten Steuerelemente für den aktuellen Anwender sichtbar sein.

Bitte beachten Sie, dass diese Maßnahme alleine natürlich keinen 100 %-igen Schutz darstellt. Gleichzeitig sollten Sie beispielsweise den Entwurfsmodus für das Formular über das Menü EXTRAS-SICHERHEITBENUTZER- UND GRUPPENBERECHTIGUNGEN (Access 2003, 2002/XP und 2000) oder EXTRAS-ZUGRIFFSRECHTE-BENUTZER- UND GRUPPENBERECHTIGUNGEN (Access 97) für „normale“ Anwender sperren oder die Datenblattansicht in der Eigenschaft „Zugelassene Ansicht(en)“ des Formulars deaktivieren.