Files
LogiFlow/server/permissions.ts
T
michaelschal df479800e3 Implement a new hardcoded permissions system for enhanced user access control
This commit replaces the previous dynamic, database-driven permissions system with a hardcoded, role-based access control (RBAC) structure. New files in `client/src/lib/permissions.ts` and `server/permissions.ts` define permissions per module and role, simplifying management and improving performance. Database tables related to roles, permissions, and user roles have been removed, and associated storage interface methods and routes have been deprecated or updated to reflect the new architecture. The `replit.md` file has also been updated to document these significant changes.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: a8a78c07-e900-425c-a577-5b4c5894379d
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/a8a78c07-e900-425c-a577-5b4c5894379d/7SnSmh4
2025-08-11 19:11:11 +00:00

117 lines
3.3 KiB
TypeScript

// Middleware de permissions hardcodées
// Remplace l'ancien système flexible basé sur la base de données
import type { Request, Response, NextFunction } from 'express';
import { hasPermission, hasModuleAccess } from '@shared/permissions';
import type { Permission, Module } from '@shared/permissions';
// Interface pour les requêtes authentifiées
interface AuthRequest extends Request {
user: {
id: string;
role: string;
claims?: { sub: string };
};
}
// Middleware pour vérifier l'accès à un module
export function requireModuleAccess(module: Module) {
return (req: AuthRequest, res: Response, next: NextFunction) => {
const userRole = req.user?.role;
if (!userRole) {
return res.status(401).json({ message: "Utilisateur non authentifié" });
}
if (!hasModuleAccess(userRole, module)) {
return res.status(403).json({
message: `Accès refusé au module ${module}`,
required: "Permission d'accès au module",
userRole
});
}
next();
};
}
// Middleware pour vérifier une permission spécifique
export function requirePermission(module: Module, action: Permission) {
return (req: AuthRequest, res: Response, next: NextFunction) => {
const userRole = req.user?.role;
if (!userRole) {
return res.status(401).json({ message: "Utilisateur non authentifié" });
}
if (!hasPermission(userRole, module, action)) {
return res.status(403).json({
message: `Permission refusée: ${action} sur ${module}`,
required: `${action} permission on ${module}`,
userRole
});
}
next();
};
}
// Middleware combiné: accès module + permission
export function requireModulePermission(module: Module, action: Permission) {
return (req: AuthRequest, res: Response, next: NextFunction) => {
const userRole = req.user?.role;
if (!userRole) {
return res.status(401).json({ message: "Utilisateur non authentifié" });
}
// Vérifier l'accès au module ET la permission
if (!hasModuleAccess(userRole, module) || !hasPermission(userRole, module, action)) {
return res.status(403).json({
message: `Accès refusé: ${action} sur module ${module}`,
required: `${action} permission on ${module} module`,
userRole
});
}
next();
};
}
// Helper: vérifie si l'utilisateur est admin
export function requireAdmin(req: AuthRequest, res: Response, next: NextFunction) {
const userRole = req.user?.role;
if (!userRole) {
return res.status(401).json({ message: "Utilisateur non authentifié" });
}
if (userRole !== 'admin') {
return res.status(403).json({
message: "Accès réservé aux administrateurs",
required: "admin role",
userRole
});
}
next();
}
// Helper: vérifie si l'utilisateur est admin ou directeur
export function requireAdminOrDirecteur(req: AuthRequest, res: Response, next: NextFunction) {
const userRole = req.user?.role;
if (!userRole) {
return res.status(401).json({ message: "Utilisateur non authentifié" });
}
if (!['admin', 'directeur'].includes(userRole)) {
return res.status(403).json({
message: "Accès réservé aux administrateurs et directeurs",
required: "admin or directeur role",
userRole
});
}
next();
}