Comment gérer des utilisateurs dans Couchdb

La plupart du temps, une application web est bâtie sur le même modèle : un frontend en html/css/js, une base de donnée et un backend ( dans le language de votre choix ) qui fait le lien entre les deux et permet de gérer les permissions utilisateurs etc…

Avec Couchdb il est possible de se passer de backend et de gérer la sécurité directement en base de données. Tout ce que je vais expliquer dans la suite de ce billet se retrouve dans la doc en ligne de Couchdb.

Création de l’utilisateur

Tout d’abord nous ajoutons un utilisateur. Pour cela il suffit de créer un document dans la base _users et de renseigner quelques champs obligatoires.

{
  "id": "org.couchdb.user:test",
  "name": "test",
  "password": "test",
  "type": "user",
  "roles": []
}

Ce sont les champs au minimum requis mais on peut tout à fait en rajouter à volonté.

Note : le champs id doit obligatoirement être préfixé par org.couchdb.user:

L’énorme avantage de passer par cette méthode ( et non pas de créer une nouvelle base « custom » pour gérer nos propres modèles d’utilisateurs ) c’est que couchdb assure le hashage et le salage du mot de passe au moment de la création de l’utilisateur !

Vérifions :

$ curl -X POST http://localhost:5984/_session -d 'name=test&password=test'
{"ok":true,"name":"test","roles":[]}

Tout fonctionne, on peut passer à la suite.

Gestion des droits

Commençons par créer une base de données

$ curl -X PUT http://localhost:5984/testdb \
    -u admin:adminpass \
    -H "Content-Type: application/json"

et donnons des droits à l’utilisateur « test » sur cette base. Pour ça, nous créons le document spécial _security

$ curl -X PUT http://localhost:5984/testdb/_security \
    -u admin:adminpass \
    -H "Content-Type: application/json" \
    -d '{"admins": { "names": [], "roles": [] }, "members": { "names": ["test"], "roles": [] } }'

Et voilà ! On ne peut plus accéder à la base « testdb » en anonyme :

$ curl http://localhost:5984/testdb
{"error":"unauthorized","reason":"You are not authorized to access this db."}

Les « members » d’un base ont les droits en lecture et écriture sur leur propre base mais ne peuvent pas créer de design docs

Voilà pour ce qui est de la base de la gestion de droits sans utiliser de backend. On peut approfondir en créant des rôles pour gérer les droits au niveau de groupe mais ce n’est pas l’objectif visé ici.

Dans mon prochain billet je vais aborder la création d’une application simple avec react.js, couchdb, et les custom event listener.