mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-12 01:37:40 +02:00
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
117 lines
3.3 KiB
TypeScript
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();
|
|
} |