Admin SSO: shared session with main site

- AdminJS uses main site session (no separate login)
- Login once at /auth/login → /admin accessible if role=admin
- Non-admin users redirected to /auth/login from /admin
- Removed separate AdminJS authentication (cookieName/cookiePassword)
This commit is contained in:
treamz 2026-03-22 00:00:13 +03:00
parent 4008155abd
commit 0664c018c6

View File

@ -193,27 +193,22 @@ async function setupAdmin(app) {
], ],
}); });
// Auth: only admin users // Auth: use main site session — admin role required
const bcrypt = require('bcrypt'); const adminRouter = AdminJSExpress.buildRouter(adminJs);
const db = require('./db');
const adminRouter = AdminJSExpress.buildAuthenticatedRouter(adminJs, { // Middleware: check main session for admin role before AdminJS
authenticate: async (email, password) => { app.use(adminJs.options.rootPath, (req, res, next) => {
const user = await db.findUserByEmail(email); // Allow AdminJS static assets (js, css, etc.)
if (!user || user.role !== 'admin') return null; if (req.path.match(/\.(js|css|png|svg|ico|map|woff|woff2|ttf)$/)) return next();
const valid = await bcrypt.compare(password, user.password_hash);
if (!valid) return null;
return { email: user.email, role: user.role, id: user.id };
},
cookieName: 'adminjs',
cookiePassword: process.env.SESSION_SECRET || 'adminjs-secret-change-me',
}, null, {
resave: false,
saveUninitialized: false,
secret: process.env.SESSION_SECRET || 'adminjs-secret-change-me',
});
app.use(adminJs.options.rootPath, adminRouter); if (req.session && req.session.user && req.session.user.role === 'admin') {
return next();
}
// Not admin — redirect to login with return URL
req.session.returnTo = '/admin';
return res.redirect('/auth/login');
}, adminRouter);
return adminJs; return adminJs;
} }