Files
LogiFlow/server/permissions.ts
T
michaelschal 947896c212 Improve invoice verification saving and update user permission handling
Add `saveInvoiceVerificationCache` to storage interfaces, implement it in `DatabaseStorage` and `MemStorage`, adjust user type in `AuthRequest` to `any`, and initialize group/supplier counters in `MemStorage`.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 7c468936-2a88-4686-ac0a-84921a45222d
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/7c468936-2a88-4686-ac0a-84921a45222d/ce6DSX9
2025-08-13 15:06:14 +00:00

113 lines
3.2 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: any;
}
// 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();
}