Estoy tratando de hacer que la funcionalidad de inicio/cierre de sesión sea de dos categorías, admin y employee .
Y cuando se use app.use(session()) , la sesión estará disponible para todas las rutas. Y eso es genial. Pero cuando quiero cerrar sesión, digamos administrador usando req.session.destroy() . Se cierra la sesión, pero toda la sesión se ha ido, incluido el administrador y el empleado. Y eso no es lo que quiero. Quiero destruir solo la sesión relacionada con el administrador para el cierre de sesión del administrador y la sesión relacionada con el empleado para el cierre de sesión del empleado. Entonces, ¿cómo puedo hacer esto?
Y soy nuevo en autenticación y autorización. Hágame saber cuáles son las mejores prácticas para usar sesiones, o si es mejor JWT o cualquier cosa que me ayude a ser mejor en eso.
Para esta pregunta relacionada.
mi aplicación.js
// session app.use( session({ secret: process.env.SECRET, resave: false, saveUninitialized: false, store, cookie: { maxAge: 20000, secure: false, }, }) ); app.use("/api/admin", adminRoutes); app.use("/api/employee", employeeRoutes); app.get("/api", (req, res) => { res.send("Api is running"); }); y cuando se llama a la ruta api/admin/login , se llama a este controlador,
const adminLoginController = asyncHandler(async (req, res) => { console.log("I ran"); const { pass } = req.body; if (someDBCheckHere) { req.session.adminAuthenticated = true; req.session.admin = { pass: pass }; res.send("success"); } else { res.status(401).send({ message: "Login Failed" }); console.log("failure"); } });No estoy muy seguro de por qué destruirías la sesión. ¿Lo leíste en alguna parte que te dice que lo hagas?
Entonces, por el comportamiento, puede ver que la sesión está destinada a vivir, no a destruirse: D
Para "cerrar sesión" de un usuario, simplemente configure la cookie en una fecha de caducidad
Confirme si mi interpretación de su requisito es correcta:
Sus usuarios pueden iniciar sesión en dos roles, con diferentes contraseñas por rol. Y es posible que incluso inicien sesión en ambos roles simultáneamente (ya sea dando dos contraseñas o porque el rol de administrador incluye el rol de empleado).
Puede lograr esto teniendo solo una sesión, con los atributos req.session.employeeAuthenticated y req.session.adminAuthenticated . Después de validar una contraseña, establecería uno (o ambos) de estos atributos, y los usuarios también podrían "cerrar la sesión del rol de administrador", después de lo cual simplemente establecería req.session.adminAuthenticated = false pero mantendría la sesión.
La primera de las adminRoutes debe validar que el usuario actual tenga el rol de administrador:
function(req, res, next) { if (req.session.adminAuthenticated) next(); else res.status(403).end("Forbidden for non-admins"); } (y del mismo modo en employeeRoutes ).
Solo cuando el usuario cierre la sesión por completo, llamarías a req.session.destroy() .