Fix administrator access and improve production deployment reliability

Corrects admin role inconsistencies and updates routes to use 'administrator' role.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 4b008663-bd72-492b-b0b6-fa252367e730
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/4b008663-bd72-492b-b0b6-fa252367e730/9GNa2aH
This commit is contained in:
michaelschal committed 2025-07-19 14:44:26 +00:00
1 parent 58d8c7a449
commit bf09dcb56b
4 files changed
+22 -15

No files matched your search

+5
View File
@@ -59,6 +59,11 @@ curl http://localhost:5000/health
- **Implémentation** : sslmode=disable dans DATABASE_URL - **Implémentation** : sslmode=disable dans DATABASE_URL
- **Robustesse** : Détection automatique du mode SSL nécessaire - **Robustesse** : Détection automatique du mode SSL nécessaire
5. **Erreur Permissions Admin** : "Insufficient permissions" pour admin
- **Problème** : Incohérence entre rôle 'admin' en DB et 'administrator' dans code
- **Solution** : Mise à jour rôle admin vers 'administrator' et correction routes
- **Implémentation** : UPDATE users + correction toutes routes requireRole()
### Status : ✅ RÉSOLU COMPLET ### Status : ✅ RÉSOLU COMPLET
Cette solution garantit un déploiement Docker fiable en production sans les problèmes de fichiers manquants, migrations échouées, ou erreurs SSL. Cette solution garantit un déploiement Docker fiable en production sans les problèmes de fichiers manquants, migrations échouées, ou erreurs SSL.
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

+3 -1
View File
@@ -330,7 +330,9 @@ Preferred communication style: Simple, everyday language.
- ✅ **Graceful Degradation**: Application starts even if migrations fail - ✅ **Graceful Degradation**: Application starts even if migrations fail
- ✅ **Auto-Creation**: Database tables created automatically on first connection - ✅ **Auto-Creation**: Database tables created automatically on first connection
- ✅ **SSL Configuration**: Fixed PostgreSQL SSL errors with sslmode=disable for Docker - ✅ **SSL Configuration**: Fixed PostgreSQL SSL errors with sslmode=disable for Docker
- ✅ **Backup Import Fix**: Corrected timestamp conversion in backup import functionality - ✅ **Backup Import Fix**: Corrected timestamp conversion in backup import functionality
- ✅ **Admin Permissions Fix**: Corrected user role 'admin' to 'administrator' for production consistency
- ✅ **Role Middleware Fix**: Updated all admin routes to use 'administrator' role instead of 'admin'
- ✅ **Production Guide**: Created comprehensive DEPLOYMENT_GUIDE.md with troubleshooting - ✅ **Production Guide**: Created comprehensive DEPLOYMENT_GUIDE.md with troubleshooting
- ✅ **Environment Templates**: Updated .env.production.example with security defaults - ✅ **Environment Templates**: Updated .env.production.example with security defaults
- ✅ **Health Diagnostics**: Added production-ready health checks and monitoring - ✅ **Health Diagnostics**: Added production-ready health checks and monitoring
+14 -14
View File
@@ -341,7 +341,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}); });
// Admin routes - Users // Admin routes - Users
app.get('/api/admin/users', requireRole(['admin']), async (req, res) => { app.get('/api/admin/users', requireRole(['administrator']), async (req, res) => {
try { try {
const users = await storage.getAllUsers(); const users = await storage.getAllUsers();
const safeUsers = users.map(user => ({ ...user, password: undefined })); const safeUsers = users.map(user => ({ ...user, password: undefined }));
@@ -352,7 +352,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
} }
}); });
app.post('/api/admin/users', requireRole(['admin']), async (req, res) => { app.post('/api/admin/users', requireRole(['administrator']), async (req, res) => {
try { try {
const userData = insertUserSchema.parse(req.body); const userData = insertUserSchema.parse(req.body);
const user = await storage.createUser(userData); const user = await storage.createUser(userData);
@@ -366,7 +366,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
} }
}); });
app.put('/api/admin/users/:id', requireRole(['admin']), async (req, res) => { app.put('/api/admin/users/:id', requireRole(['administrator']), async (req, res) => {
try { try {
const userId = parseInt(req.params.id); const userId = parseInt(req.params.id);
const currentUser = await storage.getUser(req.session.userId!); const currentUser = await storage.getUser(req.session.userId!);
@@ -409,7 +409,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
} }
}); });
app.delete('/api/admin/users/:id', requireRole(['admin']), async (req, res) => { app.delete('/api/admin/users/:id', requireRole(['administrator']), async (req, res) => {
try { try {
const userId = parseInt(req.params.id); const userId = parseInt(req.params.id);
@@ -431,7 +431,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}); });
// Admin routes - Stores // Admin routes - Stores
app.get('/api/admin/stores', requireRole(['admin']), async (req, res) => { app.get('/api/admin/stores', requireRole(['administrator']), async (req, res) => {
try { try {
const stores = await storage.getAllStores(); const stores = await storage.getAllStores();
res.json(stores); res.json(stores);
@@ -441,7 +441,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
} }
}); });
app.post('/api/admin/stores', requireRole(['admin']), async (req, res) => { app.post('/api/admin/stores', requireRole(['administrator']), async (req, res) => {
try { try {
const storeData = insertStoreSchema.parse(req.body); const storeData = insertStoreSchema.parse(req.body);
const store = await storage.createStore(storeData); const store = await storage.createStore(storeData);
@@ -455,7 +455,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
} }
}); });
app.put('/api/admin/stores/:id', requireRole(['admin']), async (req, res) => { app.put('/api/admin/stores/:id', requireRole(['administrator']), async (req, res) => {
try { try {
const storeId = parseInt(req.params.id); const storeId = parseInt(req.params.id);
const storeData = insertStoreSchema.partial().parse(req.body); const storeData = insertStoreSchema.partial().parse(req.body);
@@ -473,7 +473,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
} }
}); });
app.delete('/api/admin/stores/:id', requireRole(['admin']), async (req, res) => { app.delete('/api/admin/stores/:id', requireRole(['administrator']), async (req, res) => {
try { try {
const storeId = parseInt(req.params.id); const storeId = parseInt(req.params.id);
@@ -497,7 +497,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}); });
// Backup routes // Backup routes
app.get('/api/admin/backup/export', requireRole(['admin']), async (req, res) => { app.get('/api/admin/backup/export', requireRole(['administrator']), async (req, res) => {
try { try {
// Get all data from the database // Get all data from the database
const users = await storage.getAllUsers(); const users = await storage.getAllUsers();
@@ -537,7 +537,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
} }
}); });
app.post('/api/admin/backup/import', requireRole(['admin']), async (req, res) => { app.post('/api/admin/backup/import', requireRole(['administrator']), async (req, res) => {
try { try {
const backupData = req.body; const backupData = req.body;
@@ -648,7 +648,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}); });
// Manual backup trigger route // Manual backup trigger route
app.post('/api/admin/backup/create', requireRole(['admin']), async (req, res) => { app.post('/api/admin/backup/create', requireRole(['administrator']), async (req, res) => {
try { try {
const result = await createAutomaticBackup(); const result = await createAutomaticBackup();
if (result.success) { if (result.success) {
@@ -667,7 +667,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}); });
// Backup statistics route // Backup statistics route
app.get('/api/admin/backup/stats', requireRole(['admin']), async (req, res) => { app.get('/api/admin/backup/stats', requireRole(['administrator']), async (req, res) => {
try { try {
const stats = getBackupStats(); const stats = getBackupStats();
res.json(stats); res.json(stats);
@@ -678,7 +678,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}); });
// Admin routes - Data Purge // Admin routes - Data Purge
app.get('/api/admin/purge/stats', requireRole(['admin']), async (req, res) => { app.get('/api/admin/purge/stats', requireRole(['administrator']), async (req, res) => {
try { try {
const stats = await getPurgeStats(); const stats = await getPurgeStats();
res.json(stats); res.json(stats);
@@ -688,7 +688,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
} }
}); });
app.post('/api/admin/purge/execute', requireRole(['admin']), async (req, res) => { app.post('/api/admin/purge/execute', requireRole(['administrator']), async (req, res) => {
try { try {
const result = await executePurgeManually(); const result = await executePurgeManually();
res.json(result); res.json(result);