06ea149d41
Führt Login mit vier Rollen (Admin, Teamleiter, Mitarbeiter, Beobachter) ein, über die Teammitglieder eigenen Urlaub inkl. Pflicht-Vertreter eintragen können. Die Auslastungsberechnung berücksichtigt Urlaub jetzt als reduzierte Kapazität. Neue Konten vergeben ihr Passwort selbst beim ersten Login. Migrationsskript für bestehende Mitarbeiter aus der Vorversion inklusive. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
53 lines
1.5 KiB
JavaScript
53 lines
1.5 KiB
JavaScript
const crypto = require('crypto');
|
|
const bcrypt = require('bcryptjs');
|
|
const db = require('./db');
|
|
|
|
const SESSION_LIFETIME_DAYS = 30;
|
|
|
|
function hashPassword(password) {
|
|
return bcrypt.hashSync(password, 10);
|
|
}
|
|
|
|
function verifyPassword(password, hash) {
|
|
return bcrypt.compareSync(password, hash);
|
|
}
|
|
|
|
function createSession(userId) {
|
|
db.prepare("DELETE FROM sessions WHERE expires_at <= datetime('now')").run();
|
|
const token = crypto.randomBytes(32).toString('hex');
|
|
db.prepare(
|
|
`INSERT INTO sessions (token, user_id, expires_at) VALUES (?, ?, datetime('now', '+${SESSION_LIFETIME_DAYS} days'))`
|
|
).run(token, userId);
|
|
return token;
|
|
}
|
|
|
|
function requireAuth(req, res, next) {
|
|
const header = req.get('authorization') || '';
|
|
const token = header.startsWith('Bearer ') ? header.slice(7) : null;
|
|
if (!token) return res.status(401).json({ error: 'nicht angemeldet' });
|
|
|
|
const row = db
|
|
.prepare(
|
|
`SELECT u.id, u.employee_id, u.email, u.role FROM sessions s
|
|
JOIN users u ON u.id = s.user_id
|
|
WHERE s.token = ? AND s.expires_at > datetime('now')`
|
|
)
|
|
.get(token);
|
|
if (!row) return res.status(401).json({ error: 'Sitzung ungültig oder abgelaufen' });
|
|
|
|
req.user = row;
|
|
req.sessionToken = token;
|
|
next();
|
|
}
|
|
|
|
function requireRole(...roles) {
|
|
return (req, res, next) => {
|
|
if (!req.user || !roles.includes(req.user.role)) {
|
|
return res.status(403).json({ error: 'keine Berechtigung' });
|
|
}
|
|
next();
|
|
};
|
|
}
|
|
|
|
module.exports = { hashPassword, verifyPassword, createSession, requireAuth, requireRole };
|