-
Notifications
You must be signed in to change notification settings - Fork 7
Autorisation fr FR
Résumé : Cette page explique comment centraliser et appliquer des règles d'accès sécurisées (ex: "seul le propriétaire peut modifier") en utilisant les objets req.me et les entités injectées.
L'autorisation intervient après l'authentification. Une fois que l'on sait "qui" est l'utilisateur (req.me), il faut vérifier s'il a le droit d'effectuer l'action demandée sur une ressource précise (ex: req.item).
Dans StartER, nous recommandons de placer la logique d'autorisation directement dans le fichier de routes du module (ex: src/express/modules/item/itemRoutes.ts). Cela rend les règles faciles à auditer.
const checkAccess: RequestHandler = (req, res, next) => {
// req.item a été injecté par le param converter
// req.me a été injecté par verifyAccessToken
if (req.item.user_id === req.me.id) {
next(); // L'utilisateur est le propriétaire, on continue
} else {
res.sendStatus(403); // Interdit
}
};Pour protéger toutes les méthodes HTTP d'un chemin spécifique, vous pouvez utiliser .all() :
router
.route("/api/items/:itemId")
.all(checkAccess) // S'applique à toutes les méthodes ci-dessous
.put(itemValidator.validate, itemActions.edit)
.delete(itemActions.destroy);Pour éviter de répéter l'appel à verifyAccessToken sur chaque route, vous pouvez définir une frontière de sécurité :
// Routes publiques (lecture seule)
router.get("/api/items", itemActions.browse);
router.get("/api/items/:itemId", itemActions.read);
// --- FRONTIÈRE ---
router.use("/api/items", authActions.verifyAccessToken);
// Routes protégées (écriture)
router.post("/api/items", itemValidator.validate, itemActions.add);- Explicit over implicit : ne cachez pas l'autorisation trop profondément dans les repositories ou les actions. Elle doit être visible au niveau du routage.
- Fail fast : rejetez la requête dès que possible (middleware) avant de commencer à valider les données de la requête.
-
Utilisez req.me : ne vous basez jamais sur un ID utilisateur envoyé par le client (
req.body.user_id) pour vérifier les droits, utilisez toujours l'identité de sessionreq.me.
Co-création IA
Bien démarrer
Explications
Guides
Référence
Aller plus loin