57 lines
2.1 KiB
JavaScript
57 lines
2.1 KiB
JavaScript
const session = require('express-session');
|
||
const SQLiteStore = require('connect-sqlite3')(session);
|
||
const bcrypt = require('bcrypt');
|
||
const { db } = require('./db');
|
||
const path = require('path');
|
||
|
||
// Директория для файла с сессиями (пусть будет data/)
|
||
const sessionDbPath = path.join(__dirname, 'data', 'sessions.sqlite');
|
||
|
||
const sessionMiddleware = session({
|
||
secret: process.env.SESSION_SECRET || 'hotel-secret-key-change-me',
|
||
resave: false,
|
||
saveUninitialized: false,
|
||
cookie: {
|
||
secure: false, // для HTTPS нужно true, но у нас http
|
||
httpOnly: true,
|
||
maxAge: 24 * 60 * 60 * 1000 // 24 часа
|
||
},
|
||
store: new SQLiteStore({
|
||
db: 'sessions.sqlite', // имя файла в директории data
|
||
dir: path.join(__dirname, 'data'),
|
||
table: 'sessions' // имя таблицы
|
||
})
|
||
});
|
||
|
||
/**
|
||
* Гарантирует существование администратора, заданного переменными окружения
|
||
* (ADMIN_LOGIN / ADMIN_PASSWORD). Пароль всегда хэшируется.
|
||
*/
|
||
async function ensureAdmin() {
|
||
const login = process.env.ADMIN_LOGIN || 'admin';
|
||
const password = process.env.ADMIN_PASSWORD || 'admin';
|
||
const saltRounds = 10;
|
||
|
||
const admin = db.prepare('SELECT id FROM admins WHERE login = ?').get(login);
|
||
const hashed = await bcrypt.hash(password, saltRounds);
|
||
|
||
if (admin) {
|
||
db.prepare('UPDATE admins SET password = ? WHERE login = ?').run(hashed, login);
|
||
console.log(`Пароль администратора "${login}" обновлён (хэширован)`);
|
||
} else {
|
||
db.prepare('INSERT INTO admins (login, password) VALUES (?, ?)').run(login, hashed);
|
||
console.log(`Администратор "${login}" создан (хэширован)`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Middleware для проверки прав администратора.
|
||
*/
|
||
function requireAdmin(req, res, next) {
|
||
if (req.session && req.session.isAdmin) {
|
||
return next();
|
||
}
|
||
res.status(401).json({ error: 'Не авторизован' });
|
||
}
|
||
|
||
module.exports = { sessionMiddleware, ensureAdmin, requireAdmin }; |