Eine Mitgliederverwaltung einrichten: Wie ist das mit den Rechten?

Sie sind ein Verein und möchten Ihre Mitglieder online verwalten. Jedes Mitglied soll eine eigene Seite erhalten. Und für Ihre Vereinsverwaltung benötigen Sie diverse Tabellen, die intelligent miteinander verknüpft sind. Für solche Aufgaben steht eine Reihe von Hilfswerkzeugen zur Verfügung. Die Basis bilden Tabellen - deren Berechtigungen sind hier Thema.

Selbstanmeldung oder Eintragung durch Mitarbeiter

Sie können festlegen, daß sich neue Mitglieder selbst anmelden dürfen oder daß sie nur von Mitarbeitern im Sekretariat eingetragen werden. Im ersten Fall nutzen Sie die vordefinierte Gruppe der anonymen Nutzer mit Nick, im zweiten Fall sind alle Mitglieder autorisierte Nutzer.
  • Im ersten Fall erstellen Sie per Vorlage eine Anmeldeseite vom Seitentyp Anmeldung anonym.

    Für diese Anmeldeseite erstellen Sie einen Berechtigungssatz für die Gruppe der not-registered-user-group. Damit ist diese Seite für beliebige Leser aufrufbar.

  • Für den zweiten Fall sprechen Sie mit dem neuen Mitglied seinen Nicknamen ab, erfragen eine Mailadresse und tragen beide Informationen im Menü 13: Nutzer und Gruppen ein.
  • In beiden Fällen wird dem neuen Mitglied eine Mail mit seinem Passwort zugesandt. Im ersten Fall der Selbstanmeldung muß er sich innerhalb von 24 Stunden einmal anmelden, ansonsten verfällt seine Anmeldung. Im zweiten Fall ist dies nicht notwendig.
  • Die standardmäßig verschickte Mail können Sie im Menü 14 (II): Datenbank und Kunde unter dem Punkt Meldungen ändern.
Natürlich können Sie auch beide Varianten mischen. In diesem Fall müssen Sie entweder eine neue Gruppe erstellen, alle Vereinsmitglieder dieser Gruppe zuweisen und die später benötigten Berechtigungssätze für diese Gruppe erstellen. Oder Sie erstellen jeweils einen Berechtigungssatz für jede der vordefinierten Gruppen.

Die Selbstanmeldung bedeutet nicht, daß das Mitglied auf der öffentlichen Liste sofort erscheint. Dies können Sie gesondert festlegen.

Die Basis für das Rechtesystem

Falls gewünscht wird, daß Ihre Mitglieder gewisse ihrer Daten selbst verwalten, so ist das Konzept der Objektbesitzer zentral: Jede Zeile in einer Tabelle hat einen Besitzer. Dem Besitzer kann erlaubt werden, daß er zwar alle Datensätze lesen, jedoch nur seine eigenen Datensätze bearbeiten kann. Hat er zusätzlich das Recht, neue Datensätze hinzuzufügen, so können Nutzer Datensätze erstellen und verwalten.

Soll zusätzlich die Zeile direkt dem Nutzer zugeordnet werden, so kann im Menü 3: Tabellen eine Tabelle vom Sondertyp UID-Tabelle (UserId-Tabelle) erstellt werden. Dies ist eine Tabelle mit einer zusätzlichen ersten Spalte vom Datentyp Int, die eine Verknüpfung auf die interne Tabelle aller Datenbanknutzer enthält. Wird dieser Spalte im Menü 5: Constraints noch eine Eindeutigkeitseinschränkung zugewiesen, so kann jeder Nutzer nur genau einen Datensatz mit seiner ID hinzufügen.

Sollen die Nutzer keine eigenen Zeilen hinzufügen können, ihre Datensätze jedoch bearbeiten, so kann ein Administrator für diese Tabelle beim Erstellen eines Datensatzes diesen Datensatz einem anderen Nutzer zuweisen. Über das Selbsteditierrecht ist diesem nun die Bearbeitung möglich.

Einfacher Fall: Nutzer sollen Daten hinzufügen, eigene Daten bearbeiten und alle Daten lesen können

  • Erstellen Sie sich eine Tabelle mit geeigneten Spalten.
  • Erstellen Sie den Berechtigungssatz für die Gruppe aller Mitglieder im Menü 16: Gruppen/Rechte - Zuordnung :
    • Neu Gruppe/Recht
    • Wählen Sie unter 'Gruppe' die Gruppe der Mitglieder aus.
    • Wählen Sie als Objekttyp 'Tabellenzeilen'.
    • Wählen Sie als Objektname den Namen der Tabelle.
    • Legen Sie die Nutzerrechte
      Read
      Add
      edit own Object
      fest.
    • Speichern Sie den Berechtigungssatz ab.
  • Das war es bereits. Alle Mitglieder dieser Gruppe dürfen beliebig viele Zeilen zu dieser Tabelle hinzufügen, die eigenen Datensätze bearbeiten und alle Daten lesen.

Jeder Nutzer soll nur genau eine Zeile hinzufügen können.

Dies leistet eine UID-Tabelle mit einer Einschränkung. Bauen wir uns diese zusammen:
  • Erstellen Sie die benötigte UID-Tabelle im Menü 3: Tabellen :
    • Neue Tabelle
    • Tabellenname und Sondertyp UID-Tabelle festlegen
    • Gewünschte Spalten (Nachname, Vorname, Adresse usw.) ergänzen.
    Beim Speichern wird an der Position 1 eine neue Spalte USER_ID eingefügt und um eine schreibgeschützte Relation ergänzt, welche die Pulldownliste der Nicknamen bereitstellt.

    Ein Merkmal von UID-Tabellen besteht darin, daß beim Neuerstellen eines Datensatzes die USER_ID-Spalte immer mit der ID des ausführenden Nutzers belegt wird und anschließend nicht mehr geändert werden kann.

    Falls alle Datensätze zu dieser Tabelle von Mitarbeitern erstellt werden sollen, dann verwenden Sie stattdessen eine gewöhnliche Tabelle, ordnen jedoch beim Speichern die Zeile dem neuen Mitglied zu.

    Sollen die Mitglieder diese Grunddatensätze (Name, Adresse) nicht selbst ändern können, so genügt es, den Besitzer vom System eintragen zu lassen. Dann kann der Nutzer seinen Datensatz zwar lesen, jedoch nicht ändern. Letzteres ist sinnvoll, falls bestimmte Grunddaten nur von Mitarbeitern geändert werden sollen. Der Nutzer darf nun bsp. nur jene Spalten ändern, die seine Hobbys betreffen.

  • Erstellen Sie die notwendige Einschränkung im Menü 5: Constraints :
    • Neuer Constraint
    • Name festlegen und die im ersten Schritt erstellte Tabelle auswählen.
    • Neue C-Spalte anklicken
    • Die vordefinierte Spalte
      Tabellenname.USER_ID
      auswählen.
    • Nun speichern.
    Dies stellt sicher, daß jeder Nutzer nur höchstens einen Datensatz in dieser Tabelle erzeugt.
  • Erstellen Sie den Berechtigungssatz für die Gruppe aller Mitglieder im Menü 16: Gruppen/Rechte - Zuordnung :
    • Neu Gruppe/Recht
    • Wählen Sie unter 'Gruppe' die Gruppe der Mitglieder aus.
    • Wählen Sie als Objekttyp 'Tabellenzeilen'.
    • Wählen Sie als Objektname den Namen der UID-Tabelle.
    • Legen Sie die Nutzerrechte
      Read
      Add
      edit own Object
      fest.
    • Speichern Sie den Berechtigungssatz ab.
  • Falls sich Ihre Nutzer auf zwei Gruppen aufteilen, so erstellen Sie einen zweiten Berechtigungssatz für die zweite Gruppe.

Selbstanmeldungen zunächst ausblenden

Wenn Sie in Ihrer Datenbank Selbstanmeldungen zulassen, dann ist es meistens wünschenswert, wenn diese zunächst redaktionell überarbeitet und geprüft werden, bevor sie auf der öffentlich zugänglichen Liste der Mitglieder erscheinen. Analog möchten Sie bsp. Mitglieder ausblenden, die ihren Beitrag nicht gezahlt haben, ausgeschieden oder verstorben sind, ohne daß Sie diese aus der Datenbank löschen. Wenn Sie eine Standard-Ausgabeseite zu dieser Tabelle erstellt haben, so erreichen Sie diese Ziele mit den folgenden drei Schritten:
  • Fügen Sie eine Spalte 'Status' mit dem Datentyp 'int' und der folgenden kleinen Relation hinzu:
    1;neu;2;aktiv;3;gesperrt;4;ausgeschieden;5;verstorben
  • Auf der Ausgabeseite, auf welcher neue Nutzer bsp. neue Datensätze zu einer UID-Tabelle erstellen können, löschen Sie das Eingabefeld und die Ausgabespalten für das Feld 'Status'.
  • Nun fügen Sie dieses sd:ro-value -Element direkt nach dem öffnenden <body>-Element ein:
    <sd:ro-value
      sd:for='sample-input'
      sd:col='Status'
      sd:new-value='1'
      sd:std-value='Status'
    />
    Dieses Element sorgt dafür, daß beim Neuerstellen einer Datenzeile die Spalte 'Status' mit dem Wert 1, beim Bearbeiten einer Statuszeile immer der zuletzt gespeicherte Wert unverändert übernommen wird.

    Folglich finden Sie in der internen Suche immer mit der Suche nach Status=neu alle Neueinträge.

  • Ferner schränken Sie das Suchergebnis auf die freigegebenen Datensätze ein:
    <sd:ro-value
      sd:for='sample-output'
      sd:col='Status'
      sd:std-value='2'
    />
    Das stellt sicher, daß nur Datensätze ausgegeben werden, die von einem internen Mitarbeiter freigegeben wurden, indem ihnen in der internen Maske der Status 2 zugewiesen wurde.
Sie können testweise das Eingabefeld 'Status' sogar sichtbar lassen. Setzen Sie den Wert bei einem neuen Datensatz auf 4 und speichern Sie diesen ab. Sie werden feststellen: Der Datensatz wurde mit Status=1 gespeichert. Ebenso können Sie einen Datensatz bearbeiten - nur nicht mehr über diese Ausgabeseite den Status ändern. Für administrative Zwecke läßt sich natürlich eine Ausgabeseite ohne diese Einschränkung erstellen.

Nach dem Login sollen Mitglieder ohne Stammdaten diese erstellen. Mitglieder mit Stammdaten sollen diese bearbeiten.

Ein Login steht mit ein paar Klicks zur Verfügung. Erstellen Sie einfach eine neue Ausgabeseite vom Typ 'Login'. Nun sollen neue Nutzer von hier die Möglichkeit erhalten, ihre Grunddaten (Name, Adresse usw.) einzugeben. Nutzer, die dies bereits gemacht haben, erhalten diesen Datensatz zur Bearbeitung. Dies läßt sich auf eine verblüffend simple Art und Weise durch die Nutzung des sd:choose-null -Elements erreichen:
  • Erstellen Sie eine Standardausgabeseite zur Tabelle mit den Grunddaten.
  • Fügen Sie nach dem <body>-Element das folgende sd:ro-value -Element ein:
    <sd:ro-value
      sd:for='sample-output'
      sd:col='_Owner'
      sd:std-value='USER_ID'
    />
    Dieses Element stellt sicher, daß die Standardsuche nur die Zeilen ausgeben, die im Besitz des aktuell ausführenden Nutzers sind. Die Spalte _Owner wird zu jeder Tabelle hinzugefügt und enthält die ID des Zeilenbesitzers.
  • Das sd:switch-link -Element können Sie löschen. Es wird hier nicht benötigt.
  • Ebenso löschen Sie die oberste Eingabezeile mit der Tabellen-ID. Diese ist bei Neueingaben für Nutzer nur verwirrend.
  • Das sd:button -Element ersetzen Sie durch die folgende Konstruktion:
    <sd:choose-null sd:choose-null-type="sd:rs">
      <sd:when sd:test="sample-output">
        <span style="padding:3px">
          <sd:button sd:name="myButton1"
            sd:source="sample-input" sd:result="sample-output">
            <sd:label-save>Speichern</sd:label-save>
          </sd:button>
        </span>
      </sd:when>
      <sd:otherwise>
        <span style="padding:3px">
          <sd:button sd:only-save="true" sd:name="myButton2"
            sd:source="sample-input" sd:result="sample-output">
            <sd:label-save>Speichern</sd:label-save>
          </sd:button>
        </span>
      </sd:otherwise>
    </sd:choose-null>
    Dies erzeugt folgendes: Liefert die Suche mindestens einen Datensatz zurück, so ist der obere Test erfolgreich. Das sd:button -Element myButton1 enthält jedoch kein sd:label-search -Element, folglich wird kein Suchbutton ausgegeben. Der Nutzer kann wie gewohnt seinen Datensatz anklicken, die Eingabemaske wird mit den Daten gefüllt. Hier wird der Button mit der Beschriftung 'Speichern' ausgegeben.

    Falls noch kein Datensatz existiert, wird der 'myButton2' ausgegeben. Dieser bietet nur eine sofortige Speichermöglichkeit. Das entspricht der Funktionalität des Kontaktformulars dieser Domain.

  • Zusätzlich können Sie das sd:rs -Element in den sd:when -Part eines zweiten sd:choose-null -Elements verschieben. Das sd:otherwise -Element bleibt in diesem Fall leer oder gibt eine Meldung 'Noch keine Stammdaten definiert' aus. Das Ergebnis ist, daß dem Nutzer, der sich zum ersten Mal anmeldet, nur die Eingabemaske präsentiert wird. Nur der Nutzer, der bereits Daten definiert hat, sieht die Darstellung außerhalb des Eingabeformulars. Das sd:result-steps -Element kann gelöscht werden, da ohnehin maximal ein einziger Datensatz ausgegeben wird.
  • Für die Gruppe der Nutzer erstellen Sie einen Berechtigungssatz Tabellenzeilen/Tabellenname mit den Standardrechten für diese Variante:
    Read
    Add
    edit own Object
  • Diese Darstellung hat zunächst noch einen Makel: Ruft man die Ausgabeseite direkt mit einem Link
    seitenname.html?action=sample-input-new
    auf, so wird ebenfalls die Eingabemaske zur Erstellung eines neuen Datensatzes angeboten, auch wenn das dafür normalerweise genutzte sd:switch-link -Element gelöscht wurde. Wird die Maske ausgefüllt und der Datensatz zu speichern versucht, so gelingt dies auch - der Benutzer könnte mehrere Datensätze erzeugen.

    Dies läßt sich unterbinden, indem beim sd:input-table -Element das sd:save-type -Attribut auf den Wert 11 (= 1 | 2 | 8) gesetzt wird. Das 8-Bit bedeutet, daß vor dem Speichern eines neuen Datensatzes überprüft wird, ob es bereits einen Datensatz mit diesem Benutzer als Besitzer gibt. Falls ja, wird die Speicherung abgelehnt.

Über neue Datensätze per Aktion informieren lassen

Zusätzlich können Sie sich im Menü 4: Aktionen eine Aktion, eine Benachrichtigung für diese Tabelle erstellen lassen. Diese informiert Sie über jeden neuen Datensatz, also über jede Selbstanmeldung eines Nutzers.
  • Klicken Sie den Button 2 - 'Neue Aktion'.
  • Legen Sie einen Namen fest. Dieser Name wird intern nicht verwendet und sollte in Kurzform die Aufgabe dieser Aktion beschreiben.
  • Wählen Sie die oben genutzte Tabelle aus.
  • Wählen Sie als Ereignis 'Insert' oder 'All'.
  • Speichern Sie die Aktion ab.
Fügen Sie nun - als ein anderer Benutzer (!) - einen neuen Datensatz hinzu. Sie müßten nach spätestens fünf Minuten eine Mail erhalten. Die Warteschlange wird nur alle fünf Minuten überprüft, mehrere Mails an denselben Empfänger werden zu einer Mail zusammengefaßt.

Wenn Sie selbst einen neuen Datensatz hinzufügen, werden Sie darüber nicht per Mail informiert.

Zusammenfassung

Mit diesem Vorgehen gewinnen Sie die folgenden Typen von Tabellen:
  • Tabellen, die von Nutzern nur gelesen werden dürfen - Nutzer erhalten nur das Read-Recht und besitzen keine Zeilen.
  • Tabellen, in welchen Nutzer nur die ihnen zugeordneten Zeilen lesen dürfen - beim Erstellen wird die Zeile dem Nutzer zugeordnet, er hat das readOwnObject-Recht.
  • Tabellen, in welchen Nutzer viele Zeilen hinzufügen und bearbeiten dürfen. Ferner sind alle Zeilen lesbar. Dafür genügt ein geeigneter Berechtigungssatz.
  • Tabellen, in denen Nutzer genau eine Zeile hinzufügen und bearbeiten dürfen (UID-Tabelle mit Constraint), die ihnen eindeutig zugeordnet ist.
  • Tabellen, in denen Nutzer viele Zeilen hinzufügen und bearbeiten dürfen (UID-Tabelle ohne Constraint).
  • Ausgabeseiten, die entweder nur eine Eingabemaske oder die bereits definierten Stammdaten und eine Bearbeitungsmaske anzeigen.
Dieselbe Logik läßt sich immer dann nutzen, falls Personen an verschiedenen Standorten Daten in gemeinsamen Tabellen zusammentragen, so daß sie ihre eigenen Datensätze weiterhin editieren und ergänzen, die anderen Daten jedoch nur lesen können.

Die Verknüpfung geeigneter Ausgabeseiten wird unter Ausgabeseiten für Haupt / Detailtabellen besprochen.


Kontaktformular:

Schreiben Sie mir und wir bauen gemeinsam Ihre neue Web-Datenbank!

Die Erläuterungen zum Datenschutz habe ich gelesen und stimme diesen zu.

© 2003-2019 Jürgen Auer, Berlin.