Teil 3: Benutzerverwaltung und -autentifizierung mit sabre/dav

Teil 3: Benutzerverwaltung und -autentifizierung mit sabre/dav

In Teil 1 – Was ist sabre/dav? wurde die Synchronisationslösung für Termine, Kontakte und Aufgaben bereits vorgestellt. In Teil 2 – Installation von sabre/dav unter Ubuntu 16.04 wurden die notwendigen Befehle vorgestellt, um den eigenen sabre/dav-Server zu installieren. In diesem dritten Teil geht es nun darum den Dienst das erste Mal zu benutzen und die dafür benötigen User mit den entsprechenden Berechtigungen anzulegen. Gleichzeitig werden Sie beginnen die modulare Bauweise und die MySQL-Datenbank von sabre/dav kennen zu lernen.

Nach diesem Kapitels werden sie einen voll einsatzfähigen Synchronisationsserver haben. Ausserdem werden Sie wissen, wie Sie weitere Benutzer anlegen und verwalten können. Sie werden erste Schritte mit der MySQL-Datenbank machen, bevor es dann im vierten Teil um die Konfiguration der verschiedenen Clients gehen wird. Schon bald können Sie Ihre privaten Daten über alle Ihre Geräte und Betriebssysteme hinweg synchronisieren.

Anlage eines Benutzers mit einem eigenen Kalender und Adressbuch

Bietet sabre/dav eine Benutzerverwaltung?

SabreDAV does not provide an administrative interface to add users. While this may happen in the future, for now SabreDAV is mostly intended for developers.

Adding new users is done directly on the database. In order to allow a user to log in, add them to the users table. You must also add them to the principals table to enable calendar access.


– Evert Pot auf http://sabre.io/dav/caldav/

Dieses Zitat vom Entwickler Evert Pot soll Sie nicht entmutigen, aber auch nichts beschönigen: sabre/dav ist ein Framework von einem Entwickler für andere Entwickler. Die Installation der Software ist ziemlich gut beschrieben und sollte Ihnen durch den vorherigen Artikel nicht schwer gefallen sein. Aber bereits jetzt, wenn es an die Anlage von Benutzern geht, muss man sich selbst in der Datenbank zurechtfinden – oder eben diesen Artikel lesen. Worauf warten wir also?!?

Struktur der MySQL-Datenbank

Die zwei zentralen Tabellen für die Benutzerverwaltung von sabre/dav sind users und principals. Sie sehen diese Tabellen, wenn Sie sich mit dem vorher angelegten MySQL-User mit der MySQL-Datenbank verbinden. In der Tabelle users findet man den Benutzernamen und das gehashte Passwort digesta1, welche Sie verwenden um sich gegenüber sabre/dav zu authentifizieren.

mysql -u sabredav -p
Enter password: 

Welcome to the MySQL monitor. Commands end with ; or \g.
...

mysql> describe users;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varbinary(50)    | YES  | UNI | NULL    |                |
| digesta1 | varbinary(32)    | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+

Die principals-Tabelle ist nur unwesentlich komplizierter. Die uri beschreibt den absoluten Pfad zu des zugehörigen Users und hat immer die Form 'principals/BENUTZERNAME und hinter displayname verbirgt sich immer der Name in der Form, wie er später auch dem Anwender angezeigt wird - also z.B. Christoph Dyllick.

mysql> describe principals;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| uri         | varbinary(200)   | NO   | UNI | NULL    |                |
| email       | varbinary(80)    | YES  |     | NULL    |                |
| displayname | varchar(80)      | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

Anlage eines Benutzers

Beginne wir also mit ein paar MySQL-Befehlen um einen Benutzer anzulegen:

mysql> use sabredav;
mysql> INSERT INTO users (username, digesta1) VALUES ('cdb',MD5('cdb:SabreDAV:meinPasswort'));
mysql> INSERT INTO principals (uri, email, displayname) VALUES ('principals/cdb','cdb@datamate.org','Christoph Dyllick');

Nach diesen Datenbankeinträgen sollte sich der User cdb mit dem Passwort meinPasswort auf der Weboberfläche von sabre/dav oder per Client einloggen können. Wichtig: sabre/dav bietet keine Logout-Funktion, weshalb man nur wieder zum Login kommt, wenn man den Browser-Cache manuell leert und danach die Seite neu lädt.

Kalender und Adressbuch anlegen

Bisher haben wir nur den User cdb angelegt und noch keinen Kalender und kein Adressbuch angelegt. Dies muss nicht zwingend bei der Anlage eines Benutzers erfolgen, macht aber natürlich großen Sinn. Höchste Zeit also, um das zuvor genannte nachzuholen. Ein Adressbuch anzulegen ist dabei mit einem Befehl getan, wohingegen bei der Anlage eines Kalenders zwei Befehle und ein bischen Hirnschmalz gefordert ist.

# Zuerst legen wir das Adressbuch an
mysql> INSERT INTO addressbooks (principaluri, displayname, uri, description, synctoken) VALUES ( 'principals/cdb', 'Adressbuch', 'addresses', NULL, '1' );
+----+-----------------+-------------+-----------+-------------+-----------+
| id | principaluri    | displayname | uri       | description | synctoken |
+----+-----------------+-------------+-----------+-------------+-----------+
|  1 | principals/cdb  | Adressbuch  | addresses | NULL        |         1 |
+----+-----------------+-------------+-----------+-------------+-----------+

Die Werte der Tabelle addressbooks sind fast selbsterklärend. principaluri zeigt, welchem Benutzer aus der Tabelle principals das Adressbuch gehört. displayname ist die Bezeichnung, die der Anwender später sieht und uri beschreibt den genauen Pfad im System (in einem folgenden Artikel mehr dazu...). Die description könnte beliebig gesetzt werden, wir aber meines Wissens von den wenigsten Clients überhaupt zur Anzeige gebracht. Viel spannender ist der Wert synctoken, der bei Clientanfragen hilft zu erkennen, ob es etwas zu synchronisieren gibt. Mit jedem zusätzlichen Eintrag oder jeder Änderung in den zum Adressbuch gehörenden Einträgen steigt der synctoken um eins. Wenn also zwischen der letzten und der aktuellen Synchronisation der synctoken gleich geblieben ist, muss nichts synchronisiert werden.

# Nun zur Anlage des Kalenders
mysql> INSERT INTO calendars (synctoken, components) VALUES ('1', 'VEVENT,VTODO');
mysql> select * from calendars;
+----+-----------+--------------+
| id | synctoken | components   |
+----+-----------+--------------+
|  1 |         2 | VEVENT,VTODO |
+----+-----------+--------------+

mysql> INSERT INTO calendarinstances (calendarid, principaluri, access, displayname, uri) VALUES ( '1', 'principals/cdb', '1', 'Kalender', 'cfc80623-b1dd-4889-88fe-caa9de79902d');

# Wichtige Hinweise: 
# calendarid (=1) ist die id aus der Tabelle calendars. Wenn in der Tabelle calendars die id = 200 steht, muss auch die 200 in der Tabelle calendarinstances stehen.
# access kann die folgenden Werte annehmen: 1 = owner, 2 = readonly, 3 = readwrite
# die uri muss nicht 32 Stellen haben. Sie kann auch deutlich kürzer sein, es muss jedoch sichergestellt werden, dass die uri einzigartig ist. Später mehr dazu.

Fazit: das Ziel des eigenen Termin- und Kontaktserver ist fast erreicht.

Endlich sind alle Vorbereitungen getroffen und nun kann es mit der Synchronisation losgehen. Es wurde der erste Benutzer mit Passwort angelegt, dieser Benutzer mit ausreichenden Berechtigungen versehen und ein erster Kalender und erstes Addressbuch angelegt. Im nächsten Teil dieser Serie wird es um die Synchronisation mit verschiedensten Clients gehen, bevor wir uns weiteren Funktionen von sabre/dav zuwenden.

geschrieben von

Christoph Dyllick-Brenzinger

Christoph ist Gründer und Chefentwickler von datamate. Er ist ein absoluter Linux-Fan und hat schon früh seine Leidenschaft für Technik und Programmierung entdeckt. Seine langjährige Erfahrung als Unternehmensberater spürt man regelmäßig, wenn er nach optimalen Lösungen für die Kunden sucht. Wenn er nicht gerade den Tennisplatz unsicher macht oder bei Overwatch sein Liga-Ranking verbessert, verbringt Christoph seine Freizeit mit seiner Frau und seinen drei Kindern.