de Programmieren Backends Pocketbase

Pocketbase — API Regeln

Um die Endpunkte in Pocketbase zu schützen bietet es Out of the Box die Möglichkeit an bestimmte Regeln für die APIs zu hinterlegen und jede API Operation somit zu schützen. Hier möchte ich ein paar Beispiele geben wie man diese Regeln nutzen kann.

Beispiel 1 — Setup

Um unser Beispiel aufzubauen erstellen wir uns eine neue Collection mit dem Namen Artikel. Wir wollen nun, dass jeder alle Artikel sehen kann und nur der Ersteller oder jemand mit der Benutzergruppe “ADMIN” die Artikel bearbeiten kann.

Wir beginnen mit der Erstellung der article Collection. Als Beispiel habe ich folgende Collection also erstellt:

Eine neue Collection wird angelegt

Wichtig hierbei ist das author Feld mit einer Relation auf users und natürlich legen wir uns auch einen Beispielnutzer an um einen Artikel auf diesen auch verlinken zu können. Wir erstellen also zwei Artikel wovon wir einen mit unserem Testuser verlinken mit dem author Feld.

Beispiel Daten

Nun editieren wir unsere User Collection und fügen dort ein Feld hinzu welches wir Group nennen um dem Benutzer eine Gruppe zuweisen zu können. Wir fügen unseren User aber noch keiner Gruppe hinzu um die API Rules besser testen zu können.

Beispiel 1 — API Rules

Wir erstellen nun die API Regeln, indem wir auf Edit Collection bei unserer Article Collection clicken und wechseln zu den API Rules. Wir können nun bei der ersten Regeln einfach zum testen folgendes hinzufügen:

1@request.auth.id = @collection.article.author.id

Damit prüfen wir unseren Request mit der Authorisierungs ID (Auth ist immer die User Collection) mit unserer vorhandenen article Collection und dem jeweiligen author Feld mit der id.

Wir loggen uns auf pocketbase ein und können nun ein Request abschicken auf unsere API. Fürs einloggen schicken wir ein POST Request auf folgende URL mit unseren Benutzerdaten:

1curl --location 'http://localhost:8090/api/collections/users/auth-with-password' \
2--header 'Content-Type: application/json' \
3--data-raw '{
4    "identity": "Testuser@example.net",
5    "password": "testtest"
6}'

Zurück erhalten sollten wir ein JSON mit einem token. Das token können wir nutzen um es als Authorization header zu nutzen um uns so als unser User ausgeben zu können.

 1{
 2    "record": {
 3        "avatar": "",
 4        "collectionId": "_pb_users_auth_",
 5        "collectionName": "users",
 6        "created": "2024-07-25 08:21:16.543Z",
 7        "email": "Testuser@example.net",
 8        "emailVisibility": false,
 9        "group": "",
10        "id": "n8o1rjk10sxvtsp",
11        "name": "",
12        "updated": "2024-07-25 08:21:16.543Z",
13        "username": "Testuser",
14        "verified": true
15    },
16    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MjMxMDYyNjgsImlkIjoibjhvMXJqazEwc3h2dHNwIiwidHlwZSI6ImF1dGhSZWNvcmQifQ.nxPiANoLLB510LTtcwiMkXouw-1qPoeSzTmtZt6Jss4"
17}

Schicken wir nun ein Request auf unsere Article Collection ab und unserem Authorization Header sehen wir schon, dass wir nicht alle Artikel die wir erstellt haben zurück bekommen.

1curl --location --request GET 'http://localhost:8090/api/collections/article/records' \
2--header 'Content-Type: application/json' \
3--header 'Authorization: TOKEN'

Um das ganze nun auf alle Artikel zu erweitern kopieren wir die erste Zeile unserer Regeln in die vierte und löschen die erste, so dass die Regeln nun wie folgt aussehen:

unsere neuen Regeln

So können nur noch die Ersteller ihre Sachen selber updaten.

Fügen wir nun unserem Benutzer in die Gruppe “ADMIN” ein und editieren nochmal unsere API Regeln fürs die Update Rule wie folgt:

1@request.auth.id = author.id || @request.auth.group = "ADMIN"

Hier prüfen wir ob das Feld group den Wert ADMIN hat und wenn ja lassen wir den Request durch. Mittels der Regel author.id prüfen wir in der Anzufragenden Collection nach welchen Wert das aktuelle Dokument hat und liefern nur diese zurück mit dem richtigen Wert.

Beispiel 2 — Setup

Für unser zweites Beispiel um die API Regeln auch mit Arrays zu testen stellen wir uns vor es gibt bei Artikeln auch zwei Autoren. Dafür fügen wir der Article Collection ein neues Feld mit dem Namen authors und dem Typ Relation und multiple hinzu. Hier können wir nun mehrere Verlinkungen zu Benutzern anlegen für einen Artikel. Außerdem fügen wir noch einen Benutzer hinzu um das ganze besser testen zu können und unseren Artikel fügen wir nun dem anderen Benutzer hinzu und dem zweiten Artikel unseren Benutzer, so dass jeder Benutzer einen Artikel hat.

Unsere fertigen API Regeln

Hier prüfen wir alle authors mit dem Attribut :each welches Pocketbase bereitstellt. Mittels des each Attribut wird jedes einzelne Element von dem Feld überprüft.