Table profils / rôles
Création de la table de relation entre utilisateurs et rôles
Notions théoriques
Le type ENUM pour les rôles
Pourquoi utiliser un type ENUM pour les rôles ?
Dans une base de données relationnelle comme PostgreSQL (et donc Supabase), il est souvent nécessaire de limiter les valeurs possibles d’un champ à un ensemble précis.
C’est exactement ce que permet un type ENUM : un type personnalisé qui restreint les valeurs à une liste définie.
Dans notre projet, les utilisateurs peuvent avoir différents rôles :
- guest
- student
- teacher
- admin
- super-admin
Ces rôles ont des droits différents dans l’application. Il est donc important de les gérer de manière fiable et sécurisée.
Avantages d’un type ENUM
- Validation automatique : PostgreSQL empêche l’insertion d’une valeur non prévue.
- Lisibilité : les valeurs sont explicites et claires (
'admin','student', etc.). - Sécurité : impossible d’ajouter un rôle non prévu par erreur.
- Compatibilité avec Supabase : les types ENUM sont bien pris en charge dans l’interface.
Toujours préférer un type ENUM à une simple colonne texte quand les valeurs possibles sont connues et limitées.
Définition d’un type ENUM
Voici comment créer un type ENUM dans PostgreSQL :
create type user_role as enum ('guest', 'student', 'teacher', 'admin', 'super-admin');
Cette commande crée un nouveau type user_role avec cinq valeurs autorisées.
Créer la table user_roles
Créer une table pour stocker les rôles des utilisateurs
Une fois le type ENUM créé, on peut l’utiliser dans une table.
La table user_roles permet de lier un utilisateur à un rôle donné.
Structure de la table :
| Colonne | Type | Description |
|---|---|---|
| id | uuid | Identifiant unique (clé primaire) |
| user_id | uuid | Référence à auth.users(id) |
| role | user_role | Rôle de l’utilisateur |
| created_at | timestamp with time zone | Date de création de la ligne |
| updated_at | timestamp with time zone | Date de dernière mise à jour |
Script SQL pour créer la table
create table public.user_roles (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users(id) not null,
role user_role not null default 'guest',
created_at timestamp with time zone default current_timestamp,
updated_at timestamp with time zone default current_timestamp
);
Le champ role utilise le type user_role défini précédemment.
La valeur par défaut est 'guest'.
Bonnes pratiques cyber
- Limiter les rôles possibles via un ENUM empêche les erreurs ou attaques par injection de rôles non autorisés.
- Auditer les changements de rôle : les champs
created_atetupdated_atpermettent de tracer les modifications. - Éviter les valeurs libres : ne jamais autoriser un champ texte libre pour des rôles critiques.
Ne jamais stocker les rôles dans une chaîne de caractères libre (text) sans validation stricte.
Exemple pratique
Créer la table des rôles
Créer le type ENUM et la table des rôles
Il est possible de créer le type ENUM et la table via le SQL Editor de Supabase.
- Ouvrir l’onglet SQL Editor.
- Exécuter la requête suivante pour créer le type ENUM :
create type user_role as enum ('guest', 'student', 'teacher', 'admin', 'super-admin');
- Créer ensuite la table
user_roles:
create table public.user_roles (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users(id) not null,
role user_role not null default 'guest',
created_at timestamp with time zone default current_timestamp,
updated_at timestamp with time zone default current_timestamp
);
Insérer un rôle pour un utilisateur
Il est possible d’attribuer un rôle à un utilisateur existant :
insert into public.user_roles (user_id, role)
values ('<uuid_utilisateur>', 'admin');
Remplacer <uuid_utilisateur> par un identifiant réel d’utilisateur existant dans auth.users.