9. Sicherheit und Benutzer einstellen
Sicherheit und Benutzer einstellen
Plone verfügt über ein mächtiges und feinmaschiges Sicherheitsmodell. Es enthält eine Unmenge an Optionen für die Sicherheit auf allen Ebenen, d.h., jedes Objekt kann eigene Sicherheitseinstellungen für einen Benutzer, eine Rolle, eine Gruppe usw. haben.
Um dieses Kapitel in einen größeren Zusammenhang zu setzen, möchte ich Sie mit dem folgenden interessanten Zitat bekannt machen:
"Sicherheit ist schwer zu erreichen."
Jim Fulton, Chefentwickler von Zope
Das Sicherheitsmodell von Plone ist so mächtig und vielschichtig, dass es sehr schwierig sein kann, es zu verwalten und Fehler darin zu finden. Vermutlich sind aber die richtigen Sicherheitseinstellungen das Wichtigste an einer Plone-Site. Eine Sicherheitslücke auf Ihrer Site ist daher vielleicht der schlimmste Patzer, den Sie machen können. Aus diesem Grund behandle ich die Sicherheit in Plone sehr umfassend.
In diesem Kapitel behandle ich zuerst die gesamte Terminologie und die wichtigsten Schnittstellen, mit denen es Ihre Benutzer zu tun haben werden. Dann zeige ich Ihnen, wie Sie Benutzer und Gruppen über die Plone-Schnittstelle hinzufügen und bearbeiten können. Anschließend gehe ich die wichtigsten Werkzeuge und APIs (Application Programming Interfaces) zur Verwaltung von Benutzer- und Sicherheitseinstellungen durch. Dann behandle ich, wie man Python-Werkzeuge verwendet, um per Skript Änderungen an Benutzern und ihren Eigenschaften vorzunehmen. Und am Ende behandle ich die Sicherheit auf Servern und gehe ausführlicher auf die Benutzerauthentifikation ein. Dabei kommt auch ein detailliertes Beispiel dafür vor, wie man Benutzer von einem LDAP-Server (Lightweight Directory Access Protocol) einbindet.
Benutzer verwalten
Eine der häufigsten Aufgaben für den Administrator einer Plone-Site besteht in der Verwaltung der Mitglieder der Site. Zur Administration zählt dabei normalerweise die Wiedergewinnung von Passwörtern und Änderung von Mitgliedereinstellungen. Über das Web können Sie ziemlich viele Aufgaben erledigen, aber der beste Freund eines jeden Administrators ist natürlich eine Skriptsprache wie Python, um Änderungen en masse durchzuführen. Wenn Sie es mit sehr vielen Benutzern zu tun haben, wird der Abschnitt "Skripten von Benutzern" weiter unten in diesem Kapitel von besonderem Interesse für Sie sein.
Benutzer, Rollen und Gruppen
Zu den wichtigsten Konzepten von Plone gehören Benutzer, Rollen und Gruppen. Bevor ich Ihnen zeige, wie Sie diese bearbeiten können, möchte ich etwas detaillierter darstellen, worum es dabei jeweils geht.
Benutzer
Eine Person, die eine Plone-Site benutzt, wird auch als Benutzer bezeichnet. Der Benutzer wird von Plone authentifiziert oder auch nicht, wobei nicht authentifizierte Benutzer auch anonyme Benutzer genannt werden. Authentifizierte Benutzer sind mit einem vorhandenen Benutzerkonto angemeldet. Sollten sie kein Konto haben, dann können sie sich normalerweise selbst eines erstellen.
Anonyme Benutzer stellen insofern die niedrigste Stufe von Benutzern dar, als für sie die meisten Einschränkungen gelten. Sobald sich Benutzer anmelden, erhalten sie die Rollen zugewiesen, die ihnen ihr Konto zuordnet. Benutzer werden mit einem kurzen Bezeichner identifiziert, z.B. andym. Standardmäßig werden in Plone keine Benutzer für Sie erstellt, bis auf den einen, der vom Installationsprogramm in Zope hinzugefügt wird, damit Sie einen Administratorzugriff haben. Dessen Name hängt davon ab, was Sie im Installationsprogramm angegeben haben. Meistens ist das admin.
Rollen
Zu einer Plone-Site gehört eine Reihe von Rollen, womit eine logische Kategorisierung von Benutzern gemeint ist. Anstatt die Rechte aller Benutzer individuell einzustellen, werden die Rechte an jede Rolle einzeln zugewiesen. Jedem Benutzer können keine oder mehrere Rollen zugewiesen werden. Ein Benutzer kann z.B. ein Mitglied und ein Manager sein. Jede Rolle wird mit einem einfachen eindeutigen Namen, z.B. Member, bezeichnet.
Eine Plone-Site enthält fünf vordefinierte Rollen, die in zwei Gruppen unterteilt sind: zuweisbare und nicht zuweisbare Rollen. Zuweisbare Rollen können Sie an Benutzer zuweisen, die diese Rollen ab dem Zeitpunkt ihrer Anmeldung erhalten. Nicht zuweisbare Rollen sind solche, die bereits in einer Plone-Site vorhanden sind und nicht einem bestimmten Benutzer zugewiesen werden können. Die Rolle eines anonymen Benutzers weisen Sie einem Benutzer beispielsweise nicht zu.
Es gibt folgende nicht zuweisbare Rollen:
- Anonymous: Dies ist ein Benutzer, der nicht in der Site angemeldet ist. Das könnte ein Benutzer sein, der kein Konto hat, oder einer, der noch nicht angemeldet ist.
- Authenticated: Diese Rolle haben alle in der Site angemeldeten Benutzer, egal, welche Rolle sie sonst noch haben. Per definitionem ist ein Benutzer entweder anonym oder authentifiziert, aber nicht beides gleichzeitig. Da ein authentifizierter Benutzer sehr wenige Abstufungsmöglichkeiten bietet, wird bei den meisten Anwendungen vom Gebrauch dieser Rolle abgeraten.
Folgende zuweisbare Rollen gibt es:
- Besitzer (Owner): Diese spezielle Rolle erhalten Benutzer, wenn sie ein Objekt erzeugen. Sie gilt für einen Benutzer nur bei diesem Objekt, und die entsprechende Information wird auf dem Objekt selbst gespeichert. Normalerweise weisen Sie diese Rolle nicht explizit zu, sondern Plone macht das für Sie.
- Mitglieder (Members): Dies ist die Standardrolle von Benutzern, die sich auf Ihrer Site registriert haben. Alle, die sich mit dem Mitglied werden-Button über die Plone-Schnittstelle registrieren, haben diese Rolle.
- Redakteure (Reviewer): Dies ist ein Benutzer mit mehr Rechten als ein Mitglied, aber weniger Rechten als ein Manager. Redakteure sind Benutzer, die von anderen Mitgliedern eingegebene Inhalte bearbeiten oder prüfen können. Sie können aber nicht die Konfiguration der Site oder ein Benutzerkonto verändern.
- Manager: Manager dürfen auf einer Plone-Site fast alles machen, d.h., Sie sollten diese Rolle nur an vertrauenswürdige Entwickler und Administratoren vergeben. Ein Manager darf Inhalte löschen oder bearbeiten, Benutzer entfernen, die Site-Konfiguration ändern und sogar Ihre Plone-Site löschen.
Gruppen
Das Konzept von Gruppen unterscheidet sich von dem von Rollen. Rollen bedeuten, dass ein Benutzer mit einer Rolle andere Rechte hat als jemand mit einer anderen Rolle, während eine Gruppe eine logische Kategorisierung von Benutzern darstellt. Die Marketing-Abteilung könnte z.B. eine Gruppe sein und die Entwicklungsabteilung eine andere. Jeder Benutzer kann zu keiner oder vielen Gruppen gehören. Gruppen sind optional, d.h., Sie müssen keine Gruppen verwenden, aber das Plone-Team fand Gruppen sehr nützlich und hat sie daher eingebaut.
Die Entwickler einer Site können Gruppen nach Belieben benutzen, beispielsweise, um eine Abteilung oder eine bestimmte Art von Benutzern zu gruppieren. Den meisten Benutzern, die Plone zum ersten Mal einsetzen, rate ich, die Gruppen unverändert zu lassen. Per Voreinstellung werden keine Gruppen für Sie erzeugt.
Hinweis
Gruppen implementieren Sie mit dem Group User Folder (GRUF). Diese Gruppen sind kein Teil von Zope, sondern ein extra Werkzeug für Plone. GRUF wurde von Ingeniweb entwickelt und zur Verfügung gestellt.
Der Zugriffsrechte-Reiter
Als ich in Kapitel 3 die Veröffentlichung von Dokumenten behandelt habe, habe ich den Zugriffsrechte-Reiter übersprungen, weil er eine Einrichtung für Fortgeschrittene ist, die Sie vermutlich nicht immer verwenden möchten. Der Zugriffsrechte-Reiter ist eine Aktion in portal_actions, d.h., wenn Sie nicht möchten, dass er erscheint, gehen Sie im Zope Management Interface (ZMI) zu diesem Werkzeug und deaktivieren die Option visible. Der Zugriffsrechte-Reiter ist aber recht nützlich, weil Sie damit Benutzern und Gruppen verschiedene lokale Rollen an einem Objekt in Plone zuweisen können.
Wenn Sie einen Inhalt in einer Plone-Site hinzugefügt haben und Sie möchten, dass eine andere Person diesen Inhalt bearbeiten kann, müssen Sie ihr mehr Rechte an diesem einen Objekt geben. Das bezeichnet man als eine lokale Rolle, die Ihnen erlaubt, einem Benutzer weitergehende Rechte an einem Objekt zu geben. Wenn ich ein Dokument in Plone schreibe, werde ich zum Besitzer dieses Dokuments und erhalte gewisse Rechte. Wenn ich vor der Veröffentlichung mit meinem Kollegen Ralf an diesem Dokument zusammenarbeiten möchte, dann muss ich Ralf erweiterte Rechte geben, damit er das Dokument bearbeiten darf. Dazu gehe ich zum Zugriffsrechte-Reiter und gebe meinem Kollegen dort die nötigen Rechte.
Hinweis
Lokale Rollen können Sie auf einem Ordner oder einem Dokument vergeben. Wenn Sie einem Benutzer eine lokale Rolle an einem Ordner geben, dann erhält er diese lokale Rolle auf allen Objekten in diesem Ordner.
Der Zugriffsrechte-Reiter erscheint nur dort, wo Sie das Recht haben, Zugriffsrechte zu verändern, dazu gehört ihr eigener Ordner. Klicken Sie erst auf Mein Ordner und dann auf Zugriffsrechte. Abbildung 9.1 zeigt, wie das Formular für den Zugriffsrechte-Reiter aussieht. Es besteht aus drei Hauptkomponenten, in denen Sie einem Benutzer oder einer Gruppe eine lokale Rolle an diesem Objekt zuordnen können. Hier sehen Sie auch, wer bereits bestimmte Rollen hat.
Abbildung 9.1. Zugriff auf den Zugriffsrechte-Reiter
Um einen Benutzer zu finden, dem die Rolle zugewiesen werden soll, geben Sie einen Suchbegriff ein, z.B. Gavin, wobei eine Liste von Benutzern geöffnet wird, die Ihrem Suchkriterium entsprechen. Dann können Sie den Benutzer anklicken und im Dropdown-Menü die gewünschte Rolle auswählen. In Abbildung 9.2 gebe ich dem Benutzer Gavin die Rolle des Besitzers an diesem Ordner.
Abbildung 9.2. Zuweisen einer Rolle an einen Benutzer
In meinem vorigen Beispiel wollte ich Rechte an einen einzelnen Benutzer zuweisen, aber bei einer großen Anzahl von Benutzern kann das sehr umständlich sein, es sei denn, Sie haben ihnen Gruppen zugewiesen. Wenn ich möchte, dass die gesamte Marketing-Abteilung mein Dokument bearbeiten darf, kann ich das damit tun. Um die verfügbaren Gruppen zu erhalten, klicken Sie auf View groups, wonach eine Liste von Gruppen für diese Site geöffnet wird und Sie eine lokale Rolle an eine Gruppe zuweisen können. In Abbildung 9.3 gebe ich der Entwicklungsabteilung die Rolle des Besitzers an diesem Ordner.
Abbildung 9.3. Zuweisen einer Rolle an eine Gruppe
In Abbildung 9.4 können Sie schließlich sehen, welche Benutzer und Gruppen Rollen mit Rechten an dieser Seite haben, um sie bei Bedarf zu entfernen. Sobald Sie jemand anderem einmal eine lokale Rolle an einem Objekt gegeben haben, erlauben Sie ihm, den Zugriffsrechte-Reiter zu öffnen. Dann hindert ihn nichts mehr daran, Rollen für Sie aus dem Inhalt zu entfernen.
Abbildung 9.4. Rollen anzeigen und entfernen
Administration über das Web
Über die Plone-Schnittstelle können Sie sehr einfach den Benutzer verändern, der gewissen Gruppen zugewiesen worden ist, Benutzerangaben ändern, Gruppen hinzufügen usw. Das meiste hiervon können Sie über das Plone-Control Panel erledigen. Klicken Sie einfach auf Plone Konfiguration, und wählen Sie dann Benutzer- und Gruppenverwaltung. Dann sehen Sie zwei Reiter: Benutzer und Gruppen.
Klicken Sie auf den Benutzer-Reiter, um an die Liste der Benutzer auf dem System zu kommen. Das Formular ist ziemlich selbsterklärend: Sie können einen Benutzer entfernen, ein Passwort neu setzen (dadurch erhält der Benutzer ohnehin eine E-Mail) oder eine E-Mail ändern, und all das aus dem Formular heraus, das Sie in Abbildung 9.5 sehen.
Abbildung 9.5. Benutzer bearbeiten
Durch einen Klick auf einen Benutzer kommen Sie zum Formular mit den Benutzereinstellungen dieses Benutzers, können dort Änderungen vornehmen und dann auf Speichern klicken. Um einen neuen Benutzer hinzuzufügen, klicken Sie auf Neuen Benutzer hinzufügen. Danach wird das Formular für die Registrierung des Benutzers geöffnet, wo Sie auch Angaben zu diesem Benutzer ändern können. Da die Anzahl von Benutzern auf einer Site ziemlich groß werden kann, werden die Daten in der vertrauten Plone-Art auf mehrere kurze Listen aufgeteilt. Sie können einen Suchbegriff eingeben, mit dem über alle Benutzer hinweg nach jenen mit den passenden Namen und E-Mail-Adressen gesucht wird.
Wenn Sie auf den Gruppen-Reiter klicken, können Sie Gruppen hinzufügen, bearbeiten und löschen. Eine Gruppe fügen Sie hinzu, indem Sie auf den Button Neue Gruppe hinzufügen klicken. Danach wird ein Formular für eine Gruppe geöffnet. Darin ist Name das einzige Feld, das ausgefüllt werden muss. Dieser Name sollte ein kurzer beschreibender Name der Gruppe sein. Normalerweise hat eine Gruppe immer direkt mit einer Geschäfts- oder Site-Aktivität zu tun.
Jetzt, wo Sie eine Gruppe mit einigen Benutzern erstellt haben, können Sie Benutzer und Gruppen einander zuordnen, und zwar mit dem Plone-Control Panel. Sie können entweder einen Benutzer anklicken und diesem einige Gruppen zuordnen oder eine Gruppe anklicken und ihr Benutzer zuordnen.
Wann benutzt man Gruppen?
Gruppen sind optional, und vielleicht werden Sie nie einen Bedarf für Gruppen haben. Ein wichtiger Anwendungsfall von Gruppen besteht allerdings im Anlegen eines Workspaces. In einer einfachen Plone-Site können Benutzer Inhalte in ihrem eigenen Ordner anlegen und bearbeiten. Jedes dort erstellte Element hat diejenige Person als Besitzer, die es erstellt hat. Aber leider skaliert das nicht besonders gut. Und schließlich geht es eigentlich darum, dass einige Leute ein Dokument zusammen bearbeiten und austauschen können!
An dieser Stelle kommen Gruppen und Workspaces ins Spiel. So wie es einen Ordner für Mitglieder gibt, der alle Benutzerordner der Mitglieder enthält, gibt es auch einen Ordner namens GroupWorkspaces. Dieser wird standardmäßig immer dann erstellt, wenn eine Gruppe hinzugefügt wird, und in diesem Ordner gibt es für jede Gruppe einen weiteren Ordner. Wenn Sie also eine Gruppe namens Marketing hinzufügen, können Sie einen Ordner unter GroupWorkspaces/Marketing finden. Alle Benutzer in der Marketing-Gruppe haben das Recht, Inhalte im Marketing-Workspace zu erstellen, zu bearbeiten und zu löschen. Mit anderen Worten: Sie haben nun einen Ordner für diese Gruppe. Das ist gleichbedeutend damit, eine Gruppe hinzuzufügen und ihrem Ordner dann eine lokale Rolle zuzuordnen.
Das ist nur ein Beispiel dafür, wie nützlich eine Gruppe sein kann. Ein anderes wäre die Benutzung von Gruppen beim Workflow. Im vorigen Kapitel habe ich den Workflow erläutert und gezeigt, wie Sie eine E-Mail an bestimmte Leute schicken können, wenn irgendetwas passiert. Wenn z.B. ein Mitglied der Marketing-Gruppe ein Objekt hinzufügt, können Sie eine E-Mail an alle Benutzer dieser Gruppe schicken, statt einfach an alle Benutzer. Im Abschnitt "Die anderen Benutzer einer Gruppe bestimmen" lernen Sie, wie Sie das machen.
Auf der Plone-Website z.B. sind die Benutzer verschiedenen Entwicklergruppen zugeordnet, die für verschiedene Teile von Plone verantwortlich sind, z.B. dem Release-Team und dem Dokumentations-Team.
Gruppen verwalten
Aus dem Plone-Control Panel heraus können Sie Gruppen auf zwei verschiedene Arten verwalten. Entweder gehen Sie zu einem Benutzer und klicken auf seine Gruppen, oder Sie gehen zu einer Gruppe und klicken auf ihre Benutzer. Auf beide Arten können Sie ganz einfach Gruppen zu einem Benutzer hinzufügen und entfernen. Um einen Benutzer zu einer Gruppe hinzuzufügen, gehen Sie besser zur Benutzersuchseite und klicken erst auf einen Benutzer und dann den Gruppen-Reiter, der die entsprechenden Gruppen anzeigt. In Abbildung 9.6 sehen Sie z.B. die Gruppen des Benutzers andym.
Abbildung 9.6. Gruppen für diesen Benutzer
Um den Benutzer zu einer neuen Gruppe hinzuzufügen, markieren Sie das Kästchen für die Gruppe und klicken dann auf Füge den Benutzer der selektierten Gruppe hinzu.
Umgekehrt können Sie einen Benutzer aus einer Gruppe entfernen, indem Sie das Kästchen neben der Gruppe markieren und auf Selektierte Gruppen löschen klicken. Eine ähnliche Schnittstelle sehen Sie bei der Gruppenverwaltung, wenn Sie auf Plone Konfiguration, Gruppen- und Benutzerverwaltung und Gruppen klicken. Klicken Sie auf eine Gruppe und dann auf Gruppenmitglieder, und Sie erhalten eine Liste von Mitgliedern in dieser Gruppe, in der Sie Mitglieder hinzufügen und löschen können.
Rollen an Gruppen vergeben
Nun haben Sie gesehen, dass sowohl Benutzer als auch Gruppen Rollen haben können. Das mag Ihnen seltsam vorkommen, aber denken Sie z.B. an eine Gruppe von Vorgesetzten, die alles mit dem Inhalt tun können muss, der von einem ihrer Mitarbeiter erstellt worden ist. Um das auf der Site zu machen, müssen Sie die Rolle eines Redakteurs haben. Um eine Gruppe von Vorgesetzten einzurichten, klicken Sie auf Plone Konfiguration, Benutzer- und Gruppenverwaltung, Gruppen und dann auf Neue Gruppe hinzufügen. Nennen Sie diese Gruppe Vorgesetzter, und füllen Sie das Formular vollständig aus. Im nächsten Formular erhalten Sie eine Liste der Gruppen und der ihnen zugeordneten Rollen. Um dieser Gruppe die Rolle des Redakteurs zuzuweisen, wählen Sie die Kontrollkästchen, die der Redakteursrolle für diese Gruppe entsprechen, wie in Abbildung 9.7 zu sehen ist.
Abbildung 9.7. Einrichten der Redakteursrolle für die Gruppe Vorgesetzter
Sie haben es leicht gemacht, den Benutzern die Redakteursrolle zuzuweisen, und nun können Sie die Redakteure über die Plone-Schnittstelle verwalten. Außerdem ist es einfach, die Redakteure mit einem Programm zu bestimmen, weil Sie die Gruppe untersuchen und eine Liste ihrer Mitglieder erhalten können.
Die Idee von Gruppen mit Rollen ist tatsächlich ein kleiner Paradigmenwechsel, verglichen mit der normalen Entwicklung unter Zope, weil Sie dort an individuelle Benutzer gewöhnt sind, denen Rollen zugeordnet sind. Das können Sie in Plone natürlich weiterhin haben, aber die Zuweisung von Rollen an Gruppen ist in Plone sehr einfach.
Hinweis
Per definitionem gilt: Bei der Bestimmung der Rechte eines Benutzers an einem Objekt werden verschiedene Faktoren berücksichtigt. Erstens werden die Rollen bestimmt, die einem Benutzer zugewiesen sind. Zweitens werden die Rollen bestimmt, die ein Benutzer aus seinen Gruppen erhält. Daraus ergibt sich die Gesamtmenge an Rollen, über die ein Benutzer verfügt.
Registrierungswerkzeuge für Benutzer
Um Mitglied auf Ihrer Site zu werden, müssen sich Benutzer darauf erst einmal registrieren. Benutzer können sich sehr leicht selbst registrieren, indem sie in der oberen rechten Ecke einer Plone-Site auf Mitglied werden klicken. Das habe ich detailliert am Anfang von Kapitel 3 behandelt. Der Registrierungsvorgang für Benutzer ist ziemlich einfach, aber es sind einige Optionen dabei verfügbar. Dieser Vorgang wird von drei wichtigen Werkzeugen gesteuert: portal_registration, portal_memberdata und portal_membership, die nun in den folgenden Abschnitten vorgestellt werden.
Portal-Registrierung
Das Werkzeug portal_registration bietet eine wichtige Aktion in Plone an, nämlich ein Mitglied zu werden. Ein Klick auf diesen Link öffnet das Mitglied-Formular. Standardmäßig können alle noch nicht angemeldeten Benutzer (auch anonyme) diesen Link anklicken, um Mitglied zu werden.
Wenn sich Benutzer mit dem Mitglied-Formular registrieren, haben sie zwei einfache Möglichkeiten für eine Plone-Site: mit und ohne Validierung einer E-Mail-Adresse. Die einzig wahre Methode, eine E-Mail-Adresse zu validieren, besteht darin, eine Nachricht an diese Adresse zu schicken, um zu sehen, ob eine entsprechende Antwort zurückkommt. Die Validierung von E-Mails ist standardmäßig ausgeschaltet, d.h., wenn Benutzer sich registrieren, geben sie per Voreinstellung ihren Namen, E-Mail und Passwort in Plone ein. Dann können sie sich anmelden und die Site ganz normal benutzen. Dieses Formular haben Sie in Kapitel 3 gesehen. Falls aber die Validierung von E-Mail-Adressen eingeschaltet ist, können die Benutzer nur einen Namen, einen Benutzernamen und eine E-Mail-Adresse eingeben, wie in Abbildung 9.8 zu sehen ist.
Abbildung 9.8. Benutzer-Registrierung mit eingeschalteter E-Mail-Validierung
Nach einem Klick auf den Link in der erhaltenen E-Mail, gelangen die Benutzer zu einem Anmeldeschirm, und der Registrierungsvorgang wird normal fortgesetzt.
Um die Validierung in der Plone-Schnittstelle zu aktivieren, klicken Sie auf Plone Konfiguration und Portal Einstellungen. Unter Passworteigenschaften wählen Sie Erzeuge für das Mitglied ein Passwort und sende es ihm per E-Mail zu. und klicken auf Speichern, um die Änderung zu bestätigen.
Wenn Sie die an Benutzer verschickte E-Mail anschauen oder bearbeiten möchten, können Sie das Page Template bearbeiten, aus dem sie erzeugt wird. Sie finden das Template, indem Sie auf plone_skins, plone_templates und registered_notify_template klicken.
Mitgliederdaten
Das Werkzeug portal_memberdata enthält die Mitgliederdaten aller Benutzer. Zu einem Plone-Benutzer gibt es eine Reihe von Angaben, z.B. zu Skins, zum Zeitpunkt seiner letzten Anmeldung, zu seinem WYSIWYG-Editor (What You See Is What You Get) usw. Wenn ein Benutzer Mitglied auf einer Site wird, wird ein Standarddatensatz in portal_memberdata erzeugt. Die tatsächlich darin erzeugten Eigenschaften sehen Sie mit diesem Werkzeug. Klicken Sie auf portal_memberdata, und wählen Sie Properties, um die Eigenschaften im Standarddatensatz zu sehen. In Plone sind das folgende:
- e-mail: Die E-Mail-Adresse des Benutzers.
- portal_skin: Diese Eigenschaft ist veraltet und sollte ignoriert werden.
- listed: Zeigt diesen Benutzer im Members-Ordner an (boolescher Wert). Ist standardmäßig eingeschaltet.
- login_time: Das Datum der letzten Anmeldung in dieser Sitzung des Benutzers.
- last_login_time: Das Datum der letzten Anmeldung des Benutzers.
- fullname: Der vollständige Name des Benutzers.
- error_log_update: Wird vom Fehlerprotokollformular verwendet, bitte ignorieren.
- formtooltips: In älteren Versionen von Plone gab es Optionen für die Anzeige von Hilfen in Formularen. Heute ist das nicht mehr relevant, daher bitte ignorieren.
- visible_ids: Zeigt die IDs (oder Namen) von Objekten an. Wenn aktiviert, ist das erste Feld im Bearbeiten-Formular aller Inhaltstypen immer der Name. Durch eine Änderung des Namens können Benutzer ein Objekt umbenennen. Ist per Voreinstellung aktiviert.
- wysiwyg_editor: Der Editor, der in Formularen benutzt werden soll.
Über die Zope-Schnittstelle können Sie Einträge in dieser Liste hinzufügen oder löschen. Allerdings wird dabei nicht automatisch das Formular der Benutzerschnittstelle neu erstellt, das die Benutzer tatsächlich bearbeiten. In Kapitel 3 haben Sie gesehen, dass Benutzer durch einen Klick auf Meine Einstellungen auf die meisten dieser Eigenschaften zugreifen und sie ändern können. Wenn Sie diese Einstellungen ändern möchten, müssen Sie dieses Formular anpassen. Die in diesen Feldern angegebenen Werte sind voreingestellte Werte für einen neu registrierten Benutzer. Standardmäßig werden z.B. alle Mitglieder unter dem Mitglieder-Reiter aufgelistet, außer die Benutzer entscheiden sich explizit dagegen.
Wenn Sie z.B. nicht möchten, dass alle Mitglieder standardmäßig bei der Suche aufgelistet werden, müssen Sie die Einstellung in diesem Formular ändern. Finden Sie im Formular portal_memberdata die Eigenschaft listed, und entfernen Sie die Markierung für den Wert im Formular. Klicken Sie dann auf Save Changes, und alle neuen Benutzer werden nicht mehr aufgelistet.
Das Werkzeug portal_groupdata enthält die entsprechenden Daten für Gruppen. Die Standardeigenschaften bei einer Gruppe lauten wie folgt:
- title: Ein Titel der Gruppe
- description: Eine Beschreibung der Gruppe
- email: Eine E-Mail-Adresse
- listed: Angabe, ob die Gruppe für Benutzer aufgelistet wird
Diese Werkzeuge speichern Benutzer- und Gruppendaten in den Werkzeugen selbst und nicht im acl_users-Ordner. Wenn Sie Benutzerinformationen von einem Plone-Server zum anderen verschieben möchten, müssen Sie diese Werkzeuge ebenfalls verschieben. Nur den acl_users-Ordner zu verschieben reicht nicht aus. Das können Sie tun, indem Sie diese Werkzeuge importieren und exportieren. Vor dem Import auf der neuen Plone-Site müssen Sie allerdings das existierende Werkzeug löschen, sonst wird ein Fehler ausgelöst.
Mitgliedschaften
Das Werkzeug portal_membership verwaltet einige weitere Eigenschaften. Insbesondere verknüpft es die Mitgliederdaten mit den Mitgliedern. Beim Zugriff per ZMI auf portal_membership haben Sie eine große Anzahl von Optionen, von denen folgende die wichtigsten sind:
- Set members folder: Dies ist der Ordner, der die Mitglieder-Ordner enthält. Dieser Ordner muss vorhanden sein. Per Voreinstellung hat er den Namen Members.
- Control creation of member areas: Standardmäßig wird für jeden Benutzer ein Mitgliederbereich erstellt, wenn er Mitglied wird, was allerdings optional ist. Klicken Sie auf Turn folder creation off, um das abzuschalten. Standardmäßig werden diese Bereiche erstellt.
Unter dem Actions-Reiter finden Sie eine Reihe von Aktionen, die bei angemeldeten Benutzern Anwendung finden, z.B. Meine Favoriten, Meine Einstellungen usw. Diese haben alle die Kategorie user, damit die Aktionen in der oberen rechten Ecke erscheinen.
Das Werkzeug portal_groups bietet ähnliche Möglichkeiten wie portal_membership, aber für Gruppen. Auch hier gilt, dass bei der Erzeugung einer Gruppe ein Gruppen-Workspace erstellt wird, in dem alle Mitglieder dieser Gruppe Inhalte erstellen und bearbeiten können.
Nützliche APIs
Das Werkzeug portal_membership enthält einen der meistverwendeten Sätze an API-Funktionen. Oftmals möchten Sie wichtige Informationen herausfinden, wie z.B. den gerade angemeldeten Benutzer, ob der Benutzer anonym ist usw. Das Werkzeug portal_membership bietet Ihnen hierfür die nötigen Methoden, von denen die folgenden am wichtigsten sind:
- isAnonymousUser(): Gibt True zurück, falls der Benutzer anonym ist.
- getAuthenticatedMember(): Gibt den gerade angemeldeten Benutzer mitsamt seinen Eigenschaften aus portal_metadata zurück. Wenn keiner angemeldet ist, wird ein spezieller Benutzer nobody ohne portal_metadata-Eigenschaften zurückgegeben.
- listMemberIds(): Gibt die IDs aller Benutzer zurück.
- listMembers(): Gibt alle Benutzerobjekte zurück.
- getMemberById(id): Gibt das Benutzerobjekt zu einer gegebenen ID zurück.
- getHomeFolder(id=None): Gibt den Startordner zu einer gegebenen ID zurück. Die ID ist optional. Ohne ID wird der Startordner des aktuellen Mitglieds zurückgegeben.
- getHomeUrl(id=None): Gibt eine URL zum Startordner des Mitglieds zurück. Die ID ist optional. Ohne ID wird die URL des Startordners des aktuellen Mitglieds zurückgegeben.
Der von diesen Funktionen zurückgegebene Benutzer wird mit Daten aus dem Werkzeug portal_memberdata versehen, so dass diese Eigenschaften Attribute des Benutzerobjekts werden. Das folgende Beispiel ist ein kleines Script (Python)-Objekt, um an die E-Mail-Adresse des Benutzers Andy zu gelangen:
##parameters=
u = context.portal_membership.getMemberById("andy")
return u.email
Cookie-Authentifikation
Plone verwendet standardmäßig eine Cookie-Authentifikation bei der Identifikation seiner Benutzer, d.h., Benutzer müssen Cookies in ihrem Browser eingeschaltet haben, damit sie sich anmelden können. Diese Authentifikation erfolgt auf einer Plone-Site mit dem Objekt cookie_authentication, das die notwendige Funktionalität für die Anmeldung von Benutzern enthält. Falls Sie wirklich eine HTTP-Authentifikation (Hypertext Transfer Protocol) benutzen möchten, können Sie dieses Objekt einfach löschen. Allerdings möchte ich das wirklich nicht empfehlen, denn bei den meisten Sites eignet sich eine HTTP-Authentifikation nicht.
Dieses Objekt bietet folgende Eigenschaften, die Sie im ZMI bearbeiten können:
- Authentication cookie name: Der Name des Cookies, das für die persistente Benutzer-Authentifikation benutzt wird. Das funktioniert über ein persistentes Token für den Benutzer, das die Anmeldung des Benutzers enthält. Der Standardwert hierfür lautet __ac.
- User name form variable: Der Name der Variablen im Anmeldeformular, die den Benutzernamen enthält. Der Standardwert hierfür ist __ac_name.
- User password form variable: Der Name der Variablen im Anmeldeformular, die das Passwort enthält. Standardwert ist __ac_password.
- User name persistence form variable: Der Name der Variablen im Anmeldeformular, die das persistente Token enthält. Standardwert ist __ac_persistent.
- Login page ID: Wenn ein Benutzer sich anmelden muss, ist dies die Seite, zu der er gelangt, um die Anmeldung abzuschließen. Standardwert ist require_login.
- Logout page ID: Wenn ein Benutzer dabei ist, sich abzumelden, gelangt er zu einer netten Seite mit einer Nachricht darauf. Diese Seite hat diese ID. Der Standardwert ist logged_out.
- Failed authorization page ID: Diese Seite erscheint, wenn die Autorisierung fehlschlägt. Standardmäßig ist sie leer, da Plone etwas anderes macht.
- Use cookie paths to limit scope: Setzt das Cookie lokal zum aktuellen Ordner und allen Ordnern darunter. Lassen Sie hier den Standardwert (leer) stehen, damit Sie sich für die gesamte Site authentifizieren, unabhängig davon, wo Sie auf Einloggen klicken.
Um andere Cookies als die Standard-Cookies zu verwenden, ändern Sie einfach den Wert in diesem Formular und klicken auf Save. Aber seien Sie sich bewusst, dass, wenn Sie den Namen des Cookies ändern, alle vorhandenen Cookies auf den Rechnern Ihrer Benutzer ignoriert werden, d.h., die Benutzer müssen sich alle neu anmelden. Wenn Sie gern eine andere Anmeldeseite hätten, könnten Sie entweder das Page Template require_login anpassen oder den Wert dieser Variablen ändern.
Der eigentliche Benutzerordner
Wenn Sie im ZMI auf den Ordner acl_users klicken, erhalten Sie Zugriff auf den eigentlichen Benutzerordner einer Plone-Site. Dabei wird die Schnittstelle zum Gruppenbenutzerordner (GRUF, Group User Folder) geöffnet, in der Sie eine Vielzahl von Optionen haben.
Die GRUF-Schnittstelle ist im Prinzip den Benutzeroptionen recht ähnlich, die Sie im Plone-Control Panel haben. Sie können Benutzer und Gruppen über eine recht einfach zu verstehende Schnittstelle hinzufügen und bearbeiten. Mit einem Klick auf Benutzer und Gruppen können Sie diese Elemente bearbeiten. Wenn Sie auf den Contents-Reiter klicken, erhalten Sie eine Auswahl zwischen Benutzern und Gruppen. Klicken Sie auf Users und dann auf acl_users. Damit kommen Sie schließlich zum aktuellen Benutzerordner eines Benutzers. Dieser sieht wie der Standard-Benutzerordner aus. Sie sehen eine Liste von Benutzern, und um einen davon zu bearbeiten, klicken Sie einfach auf den Benutzernamen, wie in Abbildung 9.9 zu sehen ist.
Abbildung 9.9. Bearbeiten des Benutzerdatensatzes
An dieser Stelle können Sie das Passwort eines Benutzers oder seine Rollen verändern. Sie werden bemerken, dass hier die Gruppe Management tatsächlich als Rolle dargestellt ist, um sicherzugehen, dass keine Namenskollisionen entstehen. Der Name wird zu group_Management verändert. Wenn Sie aus einem Benutzer ein Mitglied dieser Gruppe machen möchten, könnten Sie das hier tun. Aber Sie können hier nicht viel machen, was Sie nicht auch auf höchster Ebene tun könnten, daher würde ich nicht bis auf diese Stufe hinunter gehen, es sei denn, Sie müssen hier z.B. das Passwort ändern oder eine Domain setzen.
Rechte setzen
Nun haben Sie Benutzer, Rollen und Gruppen kennen gelernt, aber es gibt noch mehr. Die niedrigste Stufe bei Sicherheitseinstellungen sind die Rechte. Wie aus der Bezeichnung hervorgeht, bedeutet, einem Benutzer ein Recht zu geben, dass er die Möglichkeit hat, etwas zu tun, z.B. ein Objekt anzuzeigen, ein Dokument zu erstellen, eine Liste mit dem Inhalt eines Ordners zu bekommen usw. Jedes Recht wird mit einem sinnvollen Namen eindeutig bezeichnet, z.B. View, Add portal content oder List folder contents.
Rechte werden nicht an einen einzelnen Benutzer vergeben, sondern an eine Rolle. Jede Rolle erhält bestimmte Rechte, und dann bekommt der Benutzer bestimmte Rollen. Alle Sicherheitseinstellungen von Zope finden Sie über das ZMI unter dem Security-Reiter. Dazu gehören die Plone-Site, das Zope-Wurzelobjekt, alle Objekte und Inhalte in einer Plone-Site sowie die Skins. Nach einem Klick auf den Security-Reiter können Sie in einem Raster alle Rechte sehen und die Rollen, auf die sie abgebildet werden (siehe auch Abbildung 9.10).
Abbildung 9.10. Sicherheitseinstellungen
In Abbildung 9.10 sehen Sie, dass dieses Objekt eine Reihe von Sicherheitseinstellungen hat. Angezeigt werden sie in Form eines Rasters mit Kontrollkästchen darin. Links stehen die Rechte in alphabetischer Reihenfolge, und oben stehen die Rollen, ebenfalls in alphabetischer Reihenfolge. Diese Seite ist ziemlich groß und unpraktisch, aber es gibt zwei nützliche Abkürzungen. Klicken Sie auf das Recht, um alle Rollen zu diesem Recht zu erhalten. In Abbildung 9.11 sehen Sie z.B. die Einstellungen zu dem Recht Access future portal content.
Abbildung 9.11. Rechte-Einstellungen
Und Sie können auf eine Rolle klicken, um alle Einstellungen zu dieser Rolle zu erhalten, was viel einfacher ist, als eine lange Liste (siehe Abbildung 9.12).
Abbildung 9.12. Einstellungen für die Redakteursrolle
Bei all diesen Rechten muss man einfach nur die Kästchen für die gewünschten Rechte markieren oder die Optionen im Auswahlmenü wählen und auf Save klicken. Falls die Einstellung Acquire Permission gewählt ist, werden die Sicherheitseinstellungen für dieses Recht akquiriert, sonst werden die Rechte nicht akquiriert. Akquisition bezeichnet die Möglichkeit eines Objekts, in der Objekthierarchie nach Rechten zu suchen und die gefundenen Rechte zu den Gesamtrechten zu kombinieren.
Hinweis
Die Rechte-Seite schaltet für Sie die Berechtigungen für den Manager ein. Ihren Manager auszuschließen wäre sehr schlecht, daher ist es nicht verkehrt, sie standardmäßig eingeschaltet zu haben.
Betrachten Sie nun das Recht Access contents information. Gehen Sie im ZMI zum Plone-Wurzelobjekt, und klicken Sie auf den Security-Reiter. In der Standardeinstellung für dieses Recht sind keine Rollen aktiviert, d.h., die Einstellungen sind für alle Benutzer leer. Allerdings ist die Option Acquire Settings markiert, d.h., Sie müssen in den Elternobjekten in der Hierarchie nachschauen, um die Rechte dieses Objekts zu bestimmen. Gehen Sie nun zum Zope-Wurzelordner, und klicken Sie auf den Security-Reiter. Danach wird die Liste der Rechte für den Wurzelordner geöffnet, in der es ganz bestimmt einige Einstellungen für das Recht Access contents information in diesem Ordner gibt, und zwar haben die Rollen Anonymous und Manager dieses Recht.
Da Rechte akquiriert werden, erhalten alle Unterordner ebenfalls diese Sicherheitseinstellungen. Das heißt, die Plone-Site und jedes Objekt in der Plone-Site wird diese Rechte haben. Wenn Sie also eine Sicherheitseinstellung für die gesamte Site festlegen möchten, müssen Sie lediglich das Recht in dem Plone-Wurzelobjekt konfigurieren, und die meisten Objekte werden diese Rechte akquirieren.
Hinweis
Eine Ausnahme bilden Objekte im Workflow, die die Akquisition explizit ausschalten. Das wird später im Abschnitt "Sicherheit und Workflow" weiter unten in diesem Kapitel beschrieben.
In Zope können Sie Rechte auf allen Objekten über das ZMI setzen. Das kann das Zope-Wurzelobjekt, eine Plone-Site, ein Ordner wie z.B. der Members-Ordner oder sogar ein gewisser Inhalt sein. Jedes Objekt hat seinen eigenen Satz an Rechten, aber nicht alle Objekte haben die gleiche Auswahl an Rechten. Das Recht Add... haben beispielsweise alle Ordner. Aber da diese Rechte in einem Objekt keinen Sinn machen, das kein Ordner ist (ein Objekt muss per definitionem ein Ordner sein, damit man darin Elemente hinzufügen kann), sind sie nicht vorhanden.
Alle Produkte oder Teile von Python-Code in Ihrer Zope-Site können ihre eigenen Sicherheitsrechte definieren, daher kann es etwas schwierig werden, genau zu definieren, was Sie mit einem bestimmten Recht tun dürfen. Tabelle 9.1 beschreibt einige der wichtigsten Rechte und was sie tun.
Tabelle 9.1. Häufige Plone-Rechte
| Recht | Beschreibung |
|---|---|
| Access contents information | Dieses Recht erlaubt den Zugriff auf ein Objekt, ohne das Objekt notwendigerweise anzuzeigen. Ein Benutzer möchte z.B. den Titel des Objekts in einer Ergebnisliste sehen, obwohl er den Inhalt der Datei nicht sehen kann. |
| Add... | Es gibt zahlreiche Rechte beim Hinzufügen, abhängig vom Typ des Objekts, das ein Benutzer erstellen möchte. Bei einer normalen Plone-Site sind alle Rechte zusammen unter Add portal content gruppiert. |
| Add portal member | Hiermit hat man die Möglichkeit, Mitglied einer Plone-Site zu werden und ein Benutzerkonto zu bekommen. |
| Copy or Move | Hiermit darf man ein Objekt kopieren oder verschieben. Auch wenn Benutzer dieses Recht haben, müssen Sie dennoch das Recht haben, das Objekt an irgendeinem Ort einzufügen. |
| Delete objects | Hiermit hat man das Recht, ein Objekt zu löschen. Im normalen Zope wird dieses Recht im Ordner geprüft. In Plone wird diese Prüfung bei allen Objekten vorgenommen. |
| List folder contents | Hiermit bekommt man eine Liste des Inhalts eines Ordners. Dabei wird nicht geprüft, ob Sie das Recht haben, das aufgelistete Objekt anzuzeigen. |
| List portal members | Hiermit hat man das Recht, eine Mitgliederliste der Site zu sehen und nach Mitgliedern zu suchen. |
| Modify portal content | Dies ist ein zusammengefasstes Recht für beliebige Änderungen an einem Objekt, z.B. Ändern des Inhalts, seiner Stichwörter oder anderer Eigenschaften. Dieses Recht gilt für fast alle Objekte. |
| Set own password | Hiermit hat man das Recht, sein eigenes Passwort in einer Plone-Site zu ändern. |
| Set own properties | Hiermit hat man das Recht, seine eigenen Eigenschaften in einer Plone-Site zu ändern. |
| View | Hiermit dürfen Benutzer das fragliche Objekt anzeigen. Dabei bedeutet View nicht nur Anzeigen als HTML, sondern auch via FTP (File Transfer Protocol), WebDAV und über andere Zugriffsformen. |
Rollen hinzufügen
Rollen an Benutzer zu vergeben bedeutet, dass Sie einen derart kompatiblen Satz von Rechten für jede Rolle finden müssen, dass die Gruppierung der Rechte Sinn macht. Das ist nicht immer möglich. Manchmal braucht ein bestimmter Benutzer etwas anderes als andere Benutzer.
Aus Entwicklersicht ist allerdings alles umso einfacher, je weniger und einfacher Sie Ihre Rollen halten können. Es ist nicht sehr kompliziert, aber es empfiehlt sich nicht, gleich für jede denkbare Sicherheitsoption eine Rolle anzulegen. Sie bringen sich damit selbst sehr schnell in ein großes Schlamassel. Ich möchte Sie stattdessen dazu bringen, die Zahl Ihrer Rollen klein und allgemein genug formuliert für die gesamte Site zu halten.
Um eine Rolle hinzuzufügen, gehen Sie zum Plone-Wurzelordner, klicken auf den Security-Reiter und scrollen zum unteren Seitenende (ein langer Weg). Unten ist ein einfaches Formular, mit dem man weitere Rollen hinzufügen oder Rollen löschen kann. Fügen Sie den Namen einer neuen Rolle hinzu, und klicken Sie auf Add Role.
Häufige Aufgaben erledigen
Einige Sicherheitseinstellungen können Sie schnell und einfach setzen, um häufige Aufgaben zu erledigen. Bevor Sie viele Änderungen an den Sicherheitseinstellungen vornehmen, empfehle ich Ihnen dringend, ein Backup Ihrer Plone-Site anzulegen. Wie Sie das machen, zeige ich Ihnen in Kapitel 14.
Verhindern weiterer Site-Mitgliedschaften
Um zu verhindern, dass weitere Benutzer Mitglied auf Ihrer Site werden, benutzen Sie das Recht Add portal member in Ihrer Zope-Wurzel für anonyme Benutzer. Dieses können Sie entweder dort für anonyme Benutzer deaktivieren, oder Sie gehen zu Ihrer Plone-Site und schalten die Einstellung Acquire Permission ab.
Blockieren der Suche auf der Site
Um zu verhindern, dass Benutzer auf Ihrer Site suchen können, benutzen Sie in der Wurzel einer Plone-Site das Recht Search ZCatalog für anonyme Benutzer. Ändern Sie also dort das Recht, indem Sie Anonymous oder einen anderen Benutzer deaktivieren.
Site-Zugriff für anonyme Benutzer völlig blockieren
Nun ja, anonyme Benutzer gänzlich von Ihrer Site fernzuhalten ist etwas trickreich, weil es ziemlich kompliziert ist, den anonymen Zugriff auf Ihre Site völlig zu blockieren. Die Benutzer müssen weiterhin auf Ihre Site zugreifen können, um sich anzumelden! Was Sie in dieser Situation wirklich möchten, ist den Zugriff auf Ihren Inhalt einzuschränken. Das können Sie mit einer Einschränkung der Rechte in Ihrem Workflow erreichen.
Sicherheit und Workflow
Wie ich in Kapitel 7 dargestellt habe, wird im Workflow die Sicherheit aller Objekte verwaltet. Das geschieht, indem der Workflow die aktuellen Rechte eines Objekts ändert. Eben habe ich Ihnen gezeigt, wie Sie sich die Sicherheitseinstellungen aller Objekte ansehen können, d.h., Sie können nun sehen, dass sich die Sicherheitseinstellungen von Objekten in einem Zustand von denen in einem anderen Zustand unterscheiden können. Wenn Sie auf portal_workflow klicken, den Contents-Reiter wählen, auf plone_workflow und dann den States-Reiter klicken, werden Sie alle verfügbaren Zustände sehen. Klicken Sie auf einen Zustand, und wählen Sie dann Permissions, um die Rechte für diesen Zustand zu sehen (siehe Abbildung 9.13).
Abbildung 9.13. Rechte für den Zustand Veröffentlicht
Wenn ein Objekt in den Zustand Veröffentlicht kommt, erhalten anonyme Benutzer, wie Sie sehen, die Rechte Access contents information und View. Das heißt, Leute können den Inhalt sehen. Sie werden bemerken, dass Mitglieder oder Besitzer ihren eigenen Inhalt nicht bearbeiten können, weil sie dieses Recht nicht haben. Die vom Workflow angewendeten Rechte werden im Permissions-Reiter gesetzt, wo Sie alle vom Workflow verwalteten Rechte setzen können.
Nachdem Sie die Sicherheitseinstellungen geändert haben, müssen Sie zum Werkzeug plone_workflow gehen und Update security settings klicken, sonst sind Sicherheitseinstellungen und Workflow des Objekts verschieden.
Hinweis
Weil sich die Rechte ändern, wenn das Objekt in einen anderen Zustand übergeht, werden andere Rechteänderungen am Objekt, die Sie evtl. über das ZMI veranlassen, entfernt, wenn diese Rechte vom Workflow verwaltet werden (und nur dann). Aus diesem Grund sollten Sie immer dem Drang widerstehen, kleine Änderungen im ZMI an der Sicherheit von Inhaltstypen vorzunehmen. Bleiben Sie dabei, das Plone-Site-Objekt und den Workflow zu ändern.
Wächter
Zu allen Übergängen gibt es Wächter, mit denen der Administrator die erlaubten Rechte auswählen kann, bevor ein Benutzer den Übergang ausführen darf. Die Prüfung, ob ein Benutzer den Übergang ausführen darf, findet in dieser Reihenfolge statt: erst die Rechte, dann die Rollen und dann der Ausdruck. Sobald eine dieser Prüfungen positiv ist, wird der Übergang ausgeführt.
Es folgen die Einstellungen eines Wächters:
- Permission: Eine Liste der erlaubten Rechte, mit Semikola (;) voneinander getrennt, z.B. Review portal content; Modify portal content.
- Roles: Eine Liste von erlaubten Rollen bei diesem Übergang, mit Semikola voneinander getrennt, z.B. Manager; Reviewer.
- Expression: Ein Workflow-TALES-Ausdruck (Template Attribute Language Expression Syntax), mit dem Sie eine bestimmte Bedingung ausdrücken können. Der folgende Übergang z.B. findet nur dann statt, wenn er im Ordner namens Members ist. Das ist kein echtes Recht, aber es ist ein netter Trick:
python: if 'Members' in state_object.getPhysicalPath()
Hinweis
getPhysicalPath ist eine Methode bei allen Objekten in Zope, die den Ort innerhalb der Zope-Objekthierarchie zurückgibt, wobei ein eventuelles virtuelles Hosting ignoriert wird.
Proxy-Rollen
Im vorigen Kapitel habe ich einige nette Methoden vorgestellt, um Benutzer zu benachrichtigen und um Inhalte zu verschieben, die von einem Workflow erfasst sind. Wenn so etwas passiert, wird das Skript dann ausgeführt, wenn der Benutzer die Workflow-Transaktion ausführt. In diesem Fall könnte Ihr Skript etwas tun, wozu Ihr Benutzer ein Recht hat oder auch nicht. Vielleicht möchten Sie z.B. nicht, dass ein Benutzer etwas in einen Ordner namens public hinzufügen darf, außer über den Workflow. Das stellt ein Problem dar, denn dann müssen Sie sicherstellen, dass das Skript mit einer übergeordneten Rolle ausgeführt werden kann.
Eine Proxy-Rolle ist etwas, womit Ihre Benutzer nicht in Berührung kommen, und wahrscheinlich werden sie auch nichts davon wissen, aber für Sie ist es eine Methode, dieses Problem zu umgehen. Angenommen, Sie möchten z.B., dass ein Benutzer einen anderen Benutzer aus der Liste aller Site-Benutzer finden kann. Sie möchten dem Benutzer nicht das Recht geben, alle Benutzer anzuzeigen, sondern nur dazu, die Benutzer in diesem bestimmten Kontext aufzulisten. Um das Skript auszuführen, braucht ein Benutzer das Recht List portal members, damit er eine Mitgliederliste bekommt, aber das möchten Sie nicht an anonyme Benutzer vergeben.
Das Skript, das diesen Befehl ausführt, muss eine übergeordnete Proxy-Rolle bekommen, wahrscheinlich Member. Gehen Sie dazu im ZMI zu dem Skript, klicken Sie auf den Proxy-Reiter und dann auf Member. Falls dieses Skript als Datei im Dateisystem vorliegt, kann diese Information in der Metadaten-Datei hinzugefügt werden. Die .metadata-Datei hätte z.B. die folgende Zeile: proxy = Member. Nun würde dieses Skript als Mitglied ausgeführt werden, wodurch Ihr Sicherheitsproblem gelöst ist!
Skripten von Benutzern
Jetzt haben Sie also eine Menge Benutzer in Ihrer Plone-Site, und daher benötigen Sie einige Skripten auf dieser Site, um Ihnen die Verwaltung der Benutzer zu erleichtern. Ab einigen hundert Benutzern kann es sehr schwer werden, Änderungen über das Web vorzunehmen, daher enthalten die folgenden Abschnitte ein paar Beispielskripten, die einige wichtige Aufgaben erledigen.
Benutzer en masse registrieren
Wenn Sie eine große Anzahl von Benutzern registrieren müssen, benötigen Sie ein Skript, um sie zu importieren. Diese Benutzer können aus einem beliebigen System stammen, das Sie mit Plone ersetzen. Wenn Sie die Benutzer allerdings schon in LDAP, einer relationalen Datenbank oder einer anderen externen Quelle haben, können Sie diese Benutzer von dort aus direkt integrieren.
Vorläufig nehmen Sie eine Anzahl von mit Kommata getrennten Benutzern in einer Datei mit folgendem Inhalt: Benutzername, vollständiger Name, E-Mail und Gruppen. In diesem Beispiel werden Sie durch diese Liste durchgehen, um alle Benutzer mit diesen Einstellungen hinzuzufügen und dann ihre Eigenschaften so zu verändern, dass sie die richtigen Einstellungen haben. Die .csv-Datei sieht daher etwa wie folgt aus:
"Benutzername", "Vollständiger Name", "E-Mail", "Gruppen" "Andy", "Andy Mckay", "andy@enfoldsystems.com", "Systeme,Vertrieb,Entwicklung" ...
Eine .csv-Datei enthält pro Zeile Werte, die mit Kommata voneinander getrennt sind, und kann mit den meisten Tabellenkalkulationsprogrammen erstellt und bearbeitet werden, darunter auch Microsoft Excel oder OpenOffice.org. Anschließend können Sie die Datei im CSV-Format exportieren und schließlich in Plone importieren. Weil dazu eine Menge von Methoden aufgerufen werden müssen, deren Nutzung nicht für alle Benutzer möglich ist, müssen Sie deswegen eine externe Methode daraus machen:
# An external method to import user
import csv
# the full path to your csv file
fileName = "/var/zope.zeo/Extensions/test.csv"
def importUsers(self):
reader = csv.reader(open(fileName, "r"))
pr = self.portal_registration
pg = self.portal_groups
out = []
# if your csv file contains a header line that
# explains the contents of each column
ignoreLine = 1
Dies ist nur der Code zum Einstellen. Mit anderen Worten: Er stellt alle Variablen ein, die Sie in diesem Skript benutzen werden. Am Anfang importieren Sie das csv-Modul, das in Python 2.3 enthalten ist und ein schnelles Parsen von .csv-Dateien ermöglicht. Die .csv-Datei steht in der Variablen fileName und ist der vollständige absolute Pfad zur Datei. Wenn Sie einen relativen Pfad angeben, sucht Plone die Datei möglicherweise am falschen Ort. Wie Sie vorher gesehen haben, wird self an die Methode übergeben, und von dort aus können Sie zu den zwei benötigten Werkzeugen gelangen: portal_registration für den Zugriff auf die Registrierungs-API und portal_groups für den Zugriff auf die Gruppen-API:
for row in reader:
if ignoreLine:
ignoreLine = 0
continue
# check we have exactly 4 items
assert len(row) == 4
id, name, email, groups = row
groups = groups.split(',')
# make a password
password = pr.generatePassword()
Als Nächstes gehen Sie alle Zeilen durch und bekommen ID, Namen, E-Mail und Gruppen. Dann generieren Sie ein zufälliges Passwort, indem Sie generatePassword aufrufen. Dabei wird ein zufälliges Passwort aus sechs Zeichen (Klein- und Großbuchstaben und Zahlen) erzeugt. Wenn Sie die ID oder das Passwort von einer Information wie dem Benutzernamen oder der E-Mail abhängig machen möchten, können Sie das hier tun. In diesem Fall habe ich alle Gruppen mit Kommata getrennt ins gleiche Feld eingetragen (z.B. "Vertrieb,Marketing"). Daher muss ich das z.B. wie folgt in eine Liste einzelner Namen trennen:
try:
# add in member
pr.addMember(id = id,
password = password,
roles = ["Member",],
properties = {
'fullname': name,
'username': id,
'email': email,
}
)
# groups are separated by commas
for groupId in groups:
group = pg.getGroupById(groupId)
group.addMember(id)
out.append("Added user %s" % id)
except ValueError, msg:
# if we skipped this user for a reason, tell the person
out.append("Skipped %s, reason: %s" % (id, msg))
# return something
return "\n".join(out)
Da Sie nun alle für die Registrierung des Benutzers nötigen Angaben haben, können Sie die eigentliche Registrierung vornehmen. Das machen Sie, indem Sie die Funktion addMember von portal_registration aufrufen, die einen Benutzer registriert. Dieser Funktion wird ein Dictionary mit Schlüssel/Wert-Paaren wie E-Mail und Name übergeben. Dann rufen Sie für jede Gruppe getGroupById auf, um die Gruppe zu bekommen und darauf addMember aufzurufen. Wie der Name schon andeutet, wird dabei der Benutzer mit dieser Gruppe registriert. Wenn Sie fertig sind, müssen Sie nur noch etwas für die Person ausgeben, die den Import ausführt.
Um das auf Ihrer Site auszuführen, müssen Sie das Skript in das Verzeichnis Extensions Ihres Plone-Servers kopieren und es import_users_with_groups.py nennen. Dann müssen Sie von Hand die Gruppen hinzufügen, die Sie auf Ihrer Site haben werden. Dieses Skript erzeugt nicht die Gruppen für Sie. Dann bereiten Sie die .csv-Datei vor. Wenn Ihre Benutzer in einem anderen System gespeichert sind, müssen Sie einen Weg finden, sie in dieses Format zu übertragen. Ändern Sie den Dateinamen im Skript auf den Namen Ihrer neuen Datei. Fügen Sie dann eine externe Methode mit den folgenden Werten zu Ihrer Plone-Site hinzu:
- ID: import_users_with_groups
- Module name: import_users_with_groups
- Function name: importUsers
Nachdem Sie diese externe Methode hinzugefügt haben, klicken Sie auf Test, um die Methode auszuführen, und Sie werden das Ergebnis bekommen!
Benutzereinstellungen ändern
Wenn Sie ein neues Produkt installieren oder eine Einstellung neu vornehmen, kann es notwendig sein, Benutzer-Metadaten en masse zu verändern. Wenn Sie z.B. einen neuen WYSIWYG-Editor installieren und möchten, dass dieser zum Standardeditor für jeden Benutzer wird, müssen Sie zwei Dinge tun:
- Ändern Sie die Standardeinstellung für alle neuen Benutzer. Dazu klicken Sie auf portal_metadata und wählen den Properties-Reiter. Setzen Sie dort die Voreinstellung, und alle neuen Benutzer erhalten diesen Wert.
- Ändern Sie die Einstellungen für alle vorhandenen Benutzer. Das kann nur mit der folgenden externen Methode durchgeführt werden:
def fixUsers(self):
pm = self.portal_membership
members = pm.listMemberIds()
out = []
for member in members:
# now get the actual member
m = pm.getMemberById(member)
# get the editor property for that member
p = m.getProperty('wysiwyg_editor', None)
out.append("%s %s" % (p, member))
if p is not None and p != 'Epoz':
m.setMemberProperties({'wysiwyg_editor': 'Epoz',})
out.append("Changed property for %s" % member)
return "\n".join(out)
Kopieren Sie diesen Code in ein Python-Modul ins Extensions-Verzeichnis Ihrer Plone-Instanz, und nennen Sie das Modul fixUserScript.py. Fügen Sie dann im ZMI eine externe Methode mit den folgenden Parametern hinzu:
- ID: fixUsers
- Module name: fixUserScript
- Function name: fixUsers
Klicken Sie auf den Test-Reiter, um den Code auszuführen. Er läuft über alle Mitglieder Ihrer Site und setzt den Wert des WYSIWYG-Editors auf "Epoz". Dazu wird zuerst die Liste aller Mitglieder geholt, und zwar mit einer Methode in portal_membership namens listMemberIds, die das für Sie erledigt. Für jedes Mitglied wird die von Plone verwendete Eigenschaft untersucht, um den Editor zu bestimmen (in diesem Fall die Eigenschaft wysiwyg_editor). Falls diese Eigenschaft verschieden von "Epoz" ist, wird setMemberProperties aufgerufen, um sie zu ändern.
Das ist eine hilfreiche Methode, um über all Ihre Mitglieder zu iterieren. Mit den Methoden setMemberProperties und getProperty können Sie eine beliebige Eigenschaft eines Mitglieds untersuchen oder ändern.
Die anderen Benutzer einer Gruppe bestimmen
Ich habe bereits die Möglichkeit erörtert, eine E-Mail an alle Leute einer Arbeitsgruppe zu einem Objekt zu schicken. Das könnten Sie zum Workflow hinzufügen, aber zuerst brauchen Sie ein Skript, um das zu tun. Dieses Beispiel verwendet ein paar Funktionen, um an die Benutzer heranzukommen. Das folgende Skript getGroupUsers nimmt ein Objekt und gibt eine Liste von Benutzern zurück:
##parameters=object=None
# object is the object to find all the members of the same group for
users = []
# get the creator
userName = object.Creator()
user = context.portal_membership.getMemberById(userName)
pg = context.portal_groups
# loop through the groups the user is in
for group in user.getGroups():
group = pg.getGroupById(group)
# loop through the users in each of those groups
for user in group.getGroupUsers():
if user not in users and user != userName:
users.append(user)
return users
In diesem Skript erhalten Sie ein Objekt, dessen Erzeuger Sie mit der Methode Creator finden müssen. Sobald Sie diesen Benutzer haben, können Sie getGroups aufrufen, und eine Methode des Benutzerobjekts listet die Namen aller Gruppen auf, in denen der Benutzer Mitglied ist. Danach erhalten Sie all diese Gruppen, und aus dieser Liste erhalten Sie die Benutzernamen zu einer Gruppe. So haben Sie schließlich alle Benutzernamen. Nun möchten Sie darunter keine Duplikate und auch nicht die ursprüngliche Person, die das Objekt geändert hat. Die Benutzerliste enthält alle anderen Benutzer in den gleichen Gruppen wie die Person, die das Objekt besitzt.
Das sollten Sie in Ihr Workflow-E-Mail-Benachrichtigungsskript aus Kapitel 7 einsetzen, um es zu verbessern. Wenn Sie sich erinnern, dann haben Sie darin Folgendes gemacht:
for user in mship.listMembers():
if "Reviewer" in mship.getMemberById(user.id).getRoles():
Das iteriert über alle Benutzer und prüft, ob sie die Mitgliederrolle haben. Das vorangegangene Skript hieß getGroupUsers und befand sich im Ordner portal_skins/custom, d.h., Sie können per Akquisition über den context-Namespace darauf zugreifen. Kurz gesagt: mit context.getGroupUsers(object) bekommen Sie die Benutzer:
users = context.getGroupUsers(object)
for id in users:
user = mship.getMemberById(id)
Nun senden Sie eine E-Mail an alle in der Gruppe statt an alle Redakteure!
Benutzerangaben in Page Templates
In Kapitel 6 haben Sie ein Page Template erstellt, mit dem ein Benutzer Feedback über ein Formular an den Site-Administrator geben konnte. In diesem Formular konnte der Benutzer in einem Eingabefeld eine E-Mail-Adresse eingeben, die Sie dann validiert haben. Wenn ein Benutzer aber angemeldet ist und Sie seine E-Mail-Adresse kennen, wäre es nett, dieses Feld für den Benutzer automatisch auszufüllen.
Der vorhandene Code für das Eingabefeld lautet wie folgt:
<input type="text" name="email_address"
tal:attributes="tabindex tabindex/next;
value request/email_address|nothing" />
Wenn nun im Anfrageformular schon ein Wert für diese E-Mail-Adresse aus einem vorangegangenen Ausfüllversuch existiert, sollten Sie ihn anzeigen. Wenn nicht, dann können Sie nachsehen, ob eine E-Mail-Adresse zum aktuellen Benutzer existiert. Die folgenden Änderungen am Formular sorgen dafür, dass die E-Mail-Adresse ausgefüllt ist:
<input type="text" name="email_address"
tal:define="user context/portal_membership/getAuthenticatedMember;
email user/email|nothing"
tal:attributes="tabindex tabindex/next;
value request/email_address|email|nothing" />
Fehlersuche und Hintergründe zur Sicherheit
Ich habe festgestellt, dass Sicherheit nicht nur einer der am schwersten zu verstehenden Bereiche von Plone ist, sondern auch einer, bei dem die Fehlersuche und das Testen sehr schwierig sind. Da das Modell granular aufgebaut und kompliziert ist, kann es extrem schwierig sein herauszufinden, warum und wo ein Fehler auftritt. Manchmal ist die angegebene Fehlermeldung oder Information schwer zu entziffern, oder es ist schon schwer, überhaupt eine Information darüber zu bekommen.
Sicherheitstests sind ebenfalls ein schwieriges Unterfangen, da Sie in Sites mit vielen Rollen einen vollständigen Regressionstest für alle Rollen in allen Situationen durchführen sollten. Wegen der damit verbundenen Kosten werden diese umfangreichen Regressiontests aber oftmals nicht durchgeführt. Außerdem ist ein Sicherheitsfehler das Schlimmste, das auf einer Site passieren kann, wenn dadurch vertrauliche Informationen verloren gehen. Plone lässt Sie hier machen, was immer Sie wollen, und hält Sie nicht davon ab, sich selbst ins Knie zu schießen, also passen Sie auf!
VerboseSecurity
VerboseSecurity ist ein Zusatzprodukt, das von den Installationsprogrammen gleich mitinstalliert wird. Sie können VerboseSecurity auch unter http://hathaway.freezope.org/Software/VerboseSecurity herunterladen. Wie der Name schon klarmacht, bietet es detaillierte Fehlermeldungen, wenn Sie etwas in Plone nicht tun dürfen, weil Sie keine Berechtigung dazu haben. Wenn Sie jedoch zu lasche Sicherheitseinstellungen benutzen, kann Ihnen dieses Produkt auch nicht helfen.
VerboseSecurity kann auf einem Plone-Server ohne Performance-Einbußen laufen, d.h., Sie können das Produkt problemlos auf Ihren Produktions- und Entwicklungsservern betreiben. Ein bisschen Leistung mag dann verloren gehen, wenn jemand kein Recht hat, etwas zu tun, ein Fehler ausgelöst wird und die neuen Sicherheitsmodule einspringen.
Da die Fehlermeldung aber sehr detailliert ist, möchten Sie diese sicher nicht den Benutzern vorsetzen. Sie enthält wesentlich mehr Informationen über Ihr System, als ein Benutzer jemals wissen sollte! Passwörter sind jedoch niemals enthalten, sondern nur Informationen über die Benutzer, Rollen und Rechte. Natürlich wird Ihr Produktionsserver immer perfekt laufen, d.h., Sie werden keinen Bedarf haben, VerboseSecurity auf Ihrem Produktionsserver zu installieren.
Die ursprüngliche Implementierung der Routinen, die die Rechte prüfen, war in Python geschrieben. Mit zunehmend stabilerem API und nachdem die Entwickler die Einsicht gewonnen hatten, welchen Overhead die Sicherheitsmaßnahmen mit sich brachten, wurde sie in C neu geschrieben. Standardmäßig läuft die schnellere C-Implementierung, was aber bedeutet, dass VerboseSecurity das Rechte-Modul nicht ändern kann, um es ausführlicher zu machen. Allerdings musste ich mich nur selten auf diese Detailstufe begeben. Normalerweise bekomme ich so schon genügend Informationen. Wenn Sie jedoch weitere Informationen benötigen, müssen Sie Plone mit der folgenden Umgebungsvariablen ausführen:
ZOPE_SECURITY_POLICY=PYTHON
Um VerboseSecurity zum Laufen zu bringen, müssen Sie lediglich sicherstellen, dass VerboseSecurity in Ihrem Products-Verzeichnis liegt (weitere Details dazu finden Sie in Kapitel 10) und dann Plone neu starten. Gehen Sie zum cookie_authentication-Objekt, das die Liste der Optionen für Ihre Site-Authentifikation enthält, und ändern Sie im Formular die Option für login_page von require_login auf einen leeren Wert, wie in Abbildung 9.14 zu sehen ist.
Abbildung 9.14. Ändern der Anmeldeeinstellungen für Ihre Site
Nun können Sie die Umstände neu wiederherstellen, unter denen der Fehler aufgetreten ist, den Sie suchen. Denken Sie daran, sich als der Benutzer anzumelden, der den Fehler bekam! An dieser Stelle ist es sehr praktisch, zwei verschiedene Browser für den Zugriff auf Ihre Plone-Site zu haben: einen für die Verwaltung und einen zum Testen. Wenn ein Fehler auftritt, wird ein HTTP-Authentifikationsdialog auf dem Bildschirm angezeigt. An diesem Punkt klicken Sie auf Abbrechen, und nun sollten Sie eine detaillierte Fehlermeldung bekommen, wie sie in Abbildung 9.15 zu sehen ist.
Abbildung 9.15. Eine schön detaillierte Fehlermeldung
Diese Meldung ist recht lang und selbsterklärend. An dieser Stelle gehe ich normalerweise zu dem anderen Browser und untersuche die Rechteeinstellungen der beteiligten Objekte, um zu sehen, was die Ursache sein könnte.
Häufige Probleme
Ein paar Probleme lassen sich leicht feststellen, wenn man es mit Plone zu tun hat. Das erste hat nichts speziell mit Plone zu tun, sollte hier aber dennoch wiederholt werden: Prüfen Sie, dass der Benutzer, der den Fehler erzeugen kann, wirklich der ist, den Sie annehmen. Ich habe oft genug von Leuten Dinge gehört wie "Funktioniert in einem Browser, aber nicht in einem anderen." Das kommt normalerweise daher, das Sie beim Browser-Wechsel auch den Benutzer wechseln.
Um mit dem Offensichtlichen weiterzumachen, überprüfen Sie zweimal, dass Ihr Benutzer auch die erwartete Rolle hat! Das kann bedeuten, in acl_users nachzusehen, welche Benutzerrolle er hat, und zu prüfen, dass die erwartete Rolle vorhanden ist. Als Nächstes denken Sie an mögliche Gruppen, in denen der Benutzer enthalten sein könnte. Wieder verschafft Ihnen ein Blick in acl_users Klarheit, da Benutzer über eine Gruppe zu weiteren Rollen kommen können. Und denken Sie schließlich daran, dass die Rolle eines Benutzers auch von lokalen Rollen in Ordnern oder Objekten verändert werden kann. Das ist etwas schwieriger festzustellen, weil es keine einfache Möglichkeit gibt festzustellen, welcher Ordner oder welche Objekte lokale Rollen haben.
Sobald Sie sich sicher sind, wer der Benutzer ist und welche Rolle er an einem Objekt hat, können Sie herausfinden, welche Rechte an einem Objekt wirklich vorhanden sind. Wie Sie gesehen haben, können zwei ähnliche Objekte (z.B. zwei Dokumente) verschiedene Rechte und Rollen haben. Der Benutzer, der das Dokument erstellt, wird auf dem Dokument die Rolle des Besitzers haben, während ein anderer Benutzer nur die Mitgliederrolle daran haben wird. Die Rechte an einem Dokument werden auch vom Workflow verändert, während es durch die verschiedenen Workflow-Zustände geht.
Plone zusperren
Plone kann man nicht so leicht zusperren, weil es kein Konzept einer "gesperrten" Site gibt. Das Grundprinzip ist aber, dass Benutzer das minimal Notwendige dessen tun können sollen, was sie tun müssen, und nicht mehr. Das heißt, Sie sollten die Standardeinstellungen überprüfen und die nicht benötigten Einstellungen entfernen.
Wirklich paranoide Zeitgenossen können auch Eigenschaften aus der Benutzerschnittstelle entfernen, um Benutzer vom Herumwandern abzuhalten, indem sie den CSS-Code verändern (Cascading Style Sheets). Aber denken Sie daran, dass allein das Entfernen eines Reiters zu einer Aktion oder die Verweigerung des Zugriffs an einem Page Template nicht ausreicht, wenn ein Benutzer z.B. weiterhin ein Dokument bearbeiten kann. Mit dem entsprechenden Wissen über Plone könnten Benutzer die Seite aus einem Skript oder über einen anderen bösartigen Mechanismus ausführen. Wenn Sie es nur intensiv genug versuchen, werden Sie sehen, dass Sie in Plone zur Bearbeiten-Seite eines Dokuments kommen, das Sie gerade anzeigen, indem Sie die entsprechende URL hacken. Allerdings wird es Ihnen nicht gelingen, die Seite wirklich zu bearbeiten; Sie können lediglich das Bearbeiten-Formular aufrufen.
Wenn Ihr Server ohne Zugangsbeschränkung in der Wildnis läuft, sollten Sie sicherstellen, dass Sie einen weiteren Webserver vor Zopes ZServer laufen lassen. Wie ich in Kapitel 10 beschreiben werde, ist der im Paket enthaltene ZServer eine einfache Implementierung ohne all die Überprüfungen und Sicherheiten, die ein echter Webserver braucht. Erwägen Sie nach Möglichkeit den Einsatz von Proxies für andere Zope-Services wie FTP und WebDAV, falls Sie Benutzern den Zugriff auf diese Dienste ermöglichen, denen Sie nicht trauen können (was normalerweise nicht der Fall ist).
Plone mit anderen Diensten integrieren
Die folgenden Abschnitte behandeln die Sicherheit außerhalb einer Plone-Instanz, z.B. alle Sicherheitseinstellungen, die Sie benötigen, um Plone auf einem Server zu betreiben. Anschließend behandle ich den Einsatz von Plone mit LDAP, damit Sie Benutzer von einem externen Server in Plone benutzen können.
Sicherheit auf Ihrem Server
Die Sicherheit von Benutzern innerhalb eines Plone-Systems habe ich behandelt, aber es gibt einen weiteren wichtigen Aspekt: die Sicherheit und Einrichtung Ihres Plone-Servers in Ihrem Betriebssystem. Wie bei allen Webanwendungen ist es ein wichtiger Schritt, die Sicherheit Ihres Servers zu gewährleisten, bevor er für die ganze Welt freigeschaltet wird. Der Installationsvorgang für Zope 2.7 ist ziemlich gut und macht das meiste hiervon für Sie bereits richtig. Aber auf einige Dinge sollten Sie hingewiesen werden, was ich nun im Folgenden tun möchte.
Der Benutzer, der Zope laufen lässt
Sie sollten sicherstellen, dass der Benutzer, der Zope laufen lässt, ein Minimum der notwendigen Sicherheitsrechte hat, um die Aufgabe zu erledigen. Der Benutzer, der Zope ausführt, benötigt Lese- und Schreibrechte an allen Zope-Verzeichnissen im Dateisystem. Der Benutzer muss in den Verzeichnissen schreiben, die die Protokolle und die Datenbank Ihrer Zope-Instanz enthalten. Das sind die Verzeichnisse var und log Ihrer Zope-Instanz.
Auf Linux macht man das am besten so, dass ein spezieller Benutzer, z.B. mit Namen plone, erstellt wird, der das übernimmt. Dann können Sie die Zugriffsmöglichkeiten dieses Benutzers für den unwahrscheinlichen Fall beschränken, dass Plone gehackt wird.
Wenn Sie mit Plone unter Linux Ports mit kleinen Nummern (unter 1024) wie 21 oder 80 belegen möchten, müssen Sie Plone normalerweise als Root ausführen. Es belegt diese Ports dann als Root und wechselt anschließend zu einem anderen effektiven Benutzer. Dazu müssen Sie einen Wert für effective-user in der Konfigurationsdatei zope.conf angeben. Dann belegt es die Ports und wechselt zu diesem Benutzer. Ein Beispiel dafür ist effective-user zope. Die beste Alternative dazu ist nicht etwa die, das gar nicht zu machen, sondern Zope stattdessen auf einem höheren Port, z.B. 8080, auszuführen. Diesen Port können Sie dann in der Firewall schützen und Apache oder einen anderen Webserver benutzen, der auf Port 80 als Proxy zu Port 8080 läuft. Kapitel 10 enthält weitere Details zu diesem Thema.
Das Äquivalent dazu unter Windows ist der Benutzer, der den Dienst ausführt, standardmäßig das Konto LocalSystem. Auch hier können Sie den Benutzer ändern, unter dem Plone läuft. Wenn Sie versuchen, Plone auf einem Windows-Rechner auszuführen, der keine Dienste hat (was ich nicht empfehlen oder unterstützen kann), läuft Plone lokal unter dem Benutzer, der den Server manuell gestartet hat.
Manche Produkte verlangen eventuell die Installation zusätzlicher Software, die z.B. Möglichkeiten der Bildverarbeitung, Dokumentkonvertierung usw. bietet. Wenn Sie solche Werkzeuge installiert haben, sollten Sie daran denken, dass eventuell ein wenig Arbeit damit verbunden ist, damit sie mit Ihrer Plone-Site erfolgreich zusammenarbeiten. Unter Windows habe ich z.B. pdftohtml für die Konvertierung von PDF-Dokumenten (Portable Document Format) installiert, aber damit der Befehl ausgeführt werden kann, musste ich den Dienst unter einem Benutzer mit zusätzlichen Privilegien ausführen, damit Zope mit dieser Software interagieren kann. In diesem Fall war das kein Problem, weil der Server hinter einer Firewall lag.
Zugriff in Notfällen
Wenn Sie eine Plone-Site haben, aber nicht auf das ZMI zugreifen können, weil Sie das Passwort nicht kennen oder vergessen haben, können Sie sich ein Notfall-Konto verschaffen. Dazu benötigen Sie den Zugriff per Dateisystem auf die Instanz Ihrer Plone-Site. Wenn Sie diesen nicht haben, müssen Sie zuerst einen Weg finden, diesen zu erhalten.
Gehen Sie dazu zu Ihrer Instanzwurzel, und starten Sie das Skript zpasswd.py, das Sie in Ihrem Zope-Verzeichnis (in ZOPE_HOME) finden. Auf meinem Rechner befindet sich das Skript zpasswd.py in /opt/Zope-2.7/bin/zpasswd.py. Um also das Passwort zu erzeugen, machen Sie Folgendes:
$ cd /var/zope $ python /opt/Zope-2.7/bin/zpasswd.py access Username: emergency Password: Verify password: Please choose a format from: SHA - SHA-1 hashed password CRYPT - UNIX-style crypt password CLEARTEXT - no protection. Encoding: SHA Domain restrictions:
Damit wird eine Datei namens access in Ihrer Zope-Instanz erzeugt. Starten Sie Zope nun erneut, und melden Sie sich im ZMI mit dem Benutzernamen und Passwort an, das in diesem Skript eingegeben wurde. Dieser Benutzer hat eine besondere Bedeutung in Plone und wird auch Notfallbenutzer genannt. Wenn Sie einmal als Notfallbenutzer angemeldet sind, können Sie keine Objekte erstellen, aber Sie können einen neuen Benutzer für sich selbst anlegen und sich als dieser Benutzer anmelden. Aus Sicherheitsgründen sollten Sie dann die Datei access löschen.
Zugriff in Notfällen unter Windows
Die Windows-Installation von Plone bietet eine grafische Benutzerschnittstelle, mit der man sehr leicht einen Notfallzugriff bekommt. Wählen Sie Start - Programme - Plone - Plone. und klicken Sie auf Emergency User. Damit können Sie einen neuen Benutzer erzeugen, das Passwort des aktuellen Notfallbenutzers ändern oder einen Notfallbenutzer löschen, wie Abbildung 9.16 zeigt.
Abbildung 9.16. Erstellen eines neuen Notfallbenutzers
Um einen neuen Benutzer zu erstellen, klicken Sie auf Create User. Geben Sie im dann erscheinenden Dialogfeld einen Benutzernamen und ein Passwort ein. Dann wird im Dateisystem eine Datei erzeugt, die den Benutzernamen und das Passwort enthält. Ein Klick auf Change Password ändert das Passwort des Benutzers. Nach dem Erstellen oder der Änderung eines Passworts müssen Sie Zope neu starten. Um Plone neu zu starten, gehen Sie zum Control-Reiter, klicken auf Stop und klicken dann auf Start. Dann klicken Sie auf Manage Root und geben den zuvor gewählten Benutzernamen und Ihr Passwort ein. Dann sind Sie als Notfallbenutzer angemeldet, d.h., Sie können keine Objekte erstellen, aber Sie können einen neuen Benutzer für sich selbst erstellen und sich als dieser Benutzer anmelden.
Externe Authentifizierungssysteme verwenden
Wie Sie in Kapitel 8 gesehen haben, speichert Plone all seine Benutzer in der Zope-Objektdatenbank in einer eigenen Benutzerliste. Das ist, wie alles, nicht perfekt, und ab einem gewissen Punkt möchten Sie vielleicht einen anderen Dienst verwenden, um Ihre Benutzer zu authentifizieren. Das am weitesten verbreitete Alternativsystem ist LDAP oder Microsofts Active Directory, das mit LDAP kommuniziert.
Möglicherweise möchten Sie aber mit einer anderen Anwendung zusammenarbeiten, die ihre Benutzer in einer relationalen Datenbank speichert. Während ich dieses Buch schrieb, verwendete die ASPN-Site von ActiveState Zope für alle Inhalte, aber dessen Benutzer können sich auch mit Microsofts Passport-System authentifizieren. Zusätzliche Schemata für die Benutzerauthentifizierung zu installieren ist dank der exzellenten Arbeit vieler Entwickler sogar sehr einfach. Bei der Einrichtung dieses Vorgangs empfand ich das Übersetzen der Software und die Integration der Systeme als den schwierigsten Teil.
Achtung
Im nächsten Abschnitt werden Sie mit den acl_users-Ordnern einer Plone-Site herumspielen. Sie sollten niemals den acl_users-Ordner in der Wurzel Ihrer Zope-Instanz löschen oder ändern. Wenn Sie das tun und Ihr Benutzerordner geht aus irgendwelchen Gründen kaputt (z.B. wenn der Server herunterfährt), ist Ihre gesamte Site blockiert und Sie werden keinerlei Zugriff mehr darauf bekommen, nicht einmal als Administrator. Stellen Sie sicher, dass Sie nur den Benutzerordner der Plone-Site ändern!
LDAP verwenden
Zuerst müssen Sie einen LDAP-Server einrichten, oder etwas, das mit LDAP kommuniziert, z.B. Active Directory (obwohl Active Directory anscheinend einige Macken hat). In diesem Beispiel habe ich openLDAP auf meinem Red Hat-Server und auf meinem Windows-Server installiert. Für Windows finden Sie eine vorkompilierte Version unter http://www.zope.org/Members/volkerw/LdapWin32. Diese habe ich mit Python 2.3 getestet.
Laden Sie die Datei herunter, packen Sie sie aus, und kopieren Sie den Inhalt nach C:\Programme\Plone\Python\lib\site-packages. Dann installieren Sie LDAPUserFolder.
Für Linux finden Sie die openLDAP-Downloads unter http://www.openldap.org. Die getestete Version enthält die RPMs 2.0.27-2.8.0 und 2.0.27-2.8.0. Nach dem Übersetzen mit den folgenden Anweisungen habe ich unter http://python-ldap.sourceforge.net die passenden LDAP-Bibliotheken für Python heruntergeladen und übersetzt. In meinem Fall war die getestete Version 2.0.0pre05-1.i386.rpm. Passen Sie auf, dass Sie denselben Python-Interpreter verwenden, mit dem auch Plone läuft.
Wenn Sie durch diese Schritte durch sind, müssen Sie sicherstellen, dass das Modul _ldap.so von Python importiert werden kann. Am leichtesten prüft man das mit dem folgenden Befehl:
$ python -c "import _ldap"
Wenn Sie keine Fehlermeldungen erhalten, dann wurde es korrekt importiert. Wenn Sie doch Fehler bekommen, müssen Sie Ihre Schritte noch einmal durchgehen. Holen Sie sich dann LDAPUserFolder unter http://www.dataflake.org/software/ldapuserfolder. Die hier getestete Version war 2.1 beta 2. Laden Sie die Datei herunter, packen Sie sie aus, und verschieben Sie sie ins Verzeichnis Products Ihrer Zope-Installation. Beispiel:
$ tar -zxf LDAPUserFolder-2_1beta2.tgz $ mv LDAPUserFolder /var/zope/Products
Nun starten Sie Plone neu, gehen zum Control Panel und vergewissern sich, dass das Produkt auf der Produktseite korrekt angezeigt wird. Weitere Details dazu gibt es in Kapitel 10.
Anschließend sollten Sie in Plone in der Lage sein, auf acl_users und Sources zu klicken und dann nach unten bis zur Option Users source #1 zu scrollen. Wählen Sie dann LDAPUserFolder, und markieren Sie I'm sure, wie in Abbildung 9.17 gezeigt. Das erzeugt einen neuen Benutzerordner und ersetzt den vorhandenen. Passen Sie also auf, dass Sie nichts Wichtiges verlieren. Tatsächlich ist jetzt ein guter Zeitpunkt für ein Backup. Anschließend klicken Sie auf OK.
Abbildung 9.17. Hinzufügen eines LDAPUserFolder
Nehmen Sie in den Einstellungen zu LDAPUserFolder die Änderungen vor, die Ihren vorhandenen LDAP-Einstellungen entsprechen. Nun sollten Sie auf den Users-Reiter klicken und nach Benutzern suchen können, die in Ihrem LDAP-Verzeichnis bereits existieren.
Relationale und andere Datenbanken
Ein hervorragender Ersatz für den Benutzerordner heißt exUserFolder, was für extensible user folder steht. Er ist sehr einfach zu installieren. Laden Sie ihn einfach unter http://prdownloads.sourceforge.net/exuserfolder/exUserFolder-0_20_0.tgz herunter, packen Sie ihn wie üblich aus, und kopieren Sie ihn in Ihr Products-Verzeichnis. Nach einem Plone-Neustart sollten Sie acl_users anklicken können, Sources wählen und zur Option Users source #1 scrollen. Dann wählen Sie exUserFolder und markieren I'm sure.
Tatsächlich führt exUserFolder eine Authentifizierung auf folgende Arten durch:
- Radius
- SMB
- LDAP
- Relationale Datenbanken
Um das machen zu können, müssen Sie die spezifischen Datenbankadapter für die relationale Datenbank installieren. Glücklicherweise sind Adapter für alle wichtigen Datenbanken vorhanden. Weitere Informationen zu fast allen Themen finden Sie in den exUserFolder-Verzeichnissen in den ReadMe-Dateien. Das Zope-Buch behandelt die Einrichtung des Zugriffs auf relationale Datenbanken unter http://zope.org/Documentation/Books/ZopeBook/2_6Edition/RelationalDatabases.stx.
Andy McKay: Plone. Addison-Wesley 2005
Es wurde zuletzt von loesch am 2006-01-11 13:38 aus der fallback Quelle aktualisiert.
















