// Authentifizierungs-Routes const bcrypt = require('bcryptjs'); const { db } = require('../database'); const LDAPService = require('../ldap-service'); const { getDefaultRole } = require('../helpers/utils'); // Helper-Funktion für erfolgreiche Anmeldung function handleSuccessfulLogin(req, res, user, rememberMe = false) { // Rollen als JSON-Array parsen let roles = []; try { roles = JSON.parse(user.role); if (!Array.isArray(roles)) { // Fallback: Falls kein Array, erstelle Array mit vorhandener Rolle roles = [user.role]; } } catch (e) { // Fallback: Falls kein JSON, erstelle Array mit vorhandener Rolle roles = [user.role || 'mitarbeiter']; } // Standard-Rolle bestimmen: Immer "mitarbeiter" wenn vorhanden, sonst höchste Priorität let defaultRole; if (roles.includes('mitarbeiter')) { defaultRole = 'mitarbeiter'; } else { defaultRole = getDefaultRole(roles); } req.session.userId = user.id; req.session.username = user.username; req.session.roles = roles; req.session.currentRole = defaultRole; req.session.firstname = user.firstname; req.session.lastname = user.lastname; // Session-Gültigkeit setzen: 30 Tage wenn "Angemeldet bleiben" aktiviert, sonst 24 Stunden if (rememberMe) { req.session.cookie.maxAge = 30 * 24 * 60 * 60 * 1000; // 30 Tage } else { req.session.cookie.maxAge = 24 * 60 * 60 * 1000; // 24 Stunden } // Redirect: Immer zu Dashboard wenn Mitarbeiter-Rolle vorhanden, sonst basierend auf Standard-Rolle if (roles.includes('mitarbeiter')) { res.redirect('/dashboard'); } else if (defaultRole === 'admin') { res.redirect('/admin'); } else if (defaultRole === 'verwaltung') { res.redirect('/verwaltung'); } else { res.redirect('/dashboard'); } } // Routes registrieren function registerAuthRoutes(app) { // Login-Seite app.get('/login', (req, res) => { res.render('login', { error: null }); }); // Login-Verarbeitung app.post('/login', (req, res) => { const { username, password, remember_me } = req.body; const rememberMe = remember_me === 'on' || remember_me === true; // Prüfe ob LDAP aktiviert ist LDAPService.getConfig((err, ldapConfig) => { if (err) { console.error('Fehler beim Abrufen der LDAP-Konfiguration:', err); } const isLDAPEnabled = ldapConfig && ldapConfig.enabled === 1; // Wenn LDAP aktiviert ist, authentifiziere gegen LDAP if (isLDAPEnabled) { LDAPService.authenticate(username, password, (authErr, authSuccess) => { if (authErr || !authSuccess) { // LDAP-Authentifizierung fehlgeschlagen - prüfe lokale Datenbank als Fallback db.get('SELECT * FROM users WHERE username = ?', [username], (err, user) => { if (err || !user) { return res.render('login', { error: 'Ungültiger Benutzername oder Passwort' }); } // Versuche lokale Authentifizierung if (bcrypt.compareSync(password, user.password)) { handleSuccessfulLogin(req, res, user, rememberMe); } else { res.render('login', { error: 'Ungültiger Benutzername oder Passwort' }); } }); } else { // LDAP-Authentifizierung erfolgreich - hole Benutzer aus Datenbank db.get('SELECT * FROM users WHERE username = ?', [username], (err, user) => { if (err || !user) { return res.render('login', { error: 'Benutzer nicht in der Datenbank gefunden. Bitte führen Sie eine LDAP-Synchronisation durch.' }); } handleSuccessfulLogin(req, res, user, rememberMe); }); } }); } else { // LDAP nicht aktiviert - verwende lokale Authentifizierung db.get('SELECT * FROM users WHERE username = ?', [username], (err, user) => { if (err || !user) { return res.render('login', { error: 'Ungültiger Benutzername oder Passwort' }); } if (bcrypt.compareSync(password, user.password)) { handleSuccessfulLogin(req, res, user, rememberMe); } else { res.render('login', { error: 'Ungültiger Benutzername oder Passwort' }); } }); } }); }); // Logout app.get('/logout', (req, res) => { req.session.destroy(); res.redirect('/login'); }); } module.exports = registerAuthRoutes;