ExpressJS:如何有条件地启动会话?
ExpressJS: How to conditionally start session?
这听起来确实是一个 simple/silly 问题,但我在网上找不到任何相关信息。
我将 Express 4 与 NodeJS 一起使用,并尝试使用 express-session
middleware 实现会话。我想使用会话 allow/disallow 不同用户的某些路由。
我知道我可以在条件路由上使用会话:
const express = require('express');
const Router = require('express').Router;
const router = new Router();
const session = require('express-session');
const sessioning = session({...});
router.post('/login', sessioning, (req, res) => {
});
但这不是我想要做的。即使登录尝试失败,这也会启动一个会话。
我想做的是仅在成功登录尝试后启动会话:
const express = require('express');
const Router = require('express').Router;
const router = new Router();
const session = require('express-session');
router.post('/login', (req, res) => {
/* ... Login validations */
if (login === 'success'){
/* ... start session */
}
res.json({...});
});
这样我就可以禁止未经身份验证的用户访问受保护的路由:
router.get('/protected', (req, res) => {
if (!req.session){
res.status(401);
res.end();
return;
}
/* ... */
});
如果我直接在受保护的路由上设置会话,那么它无法验证用户是否登录。
任何人都可以指出正确的方向吗?
这并没有回答您的主要问题,而是解决了您的(看似)主要问题:
If I set session directly on protected routes, then it can't verify whether or not a user is logged in.
您可以附加一个变量到req.session
对象来检查用户是否登录。
在您的 login
路线中设置 loggedIn
状态
router.post('/login', (req, res) => {
/* ... Login validations */
if (login === 'success'){
req.session.loggedIn = true;
}
// ...
});
并设置一个中间件来检查用户是否登录并保护您的路由。
function checkLoggedIn(req, res, next) {
if (req.session.loggedIn)
next();
else
res.redirect('/login')
}
// Your protected route
router.get('/protected', checkLoggedIn, (req, res) => {
// ...
});
这听起来确实是一个 simple/silly 问题,但我在网上找不到任何相关信息。
我将 Express 4 与 NodeJS 一起使用,并尝试使用 express-session
middleware 实现会话。我想使用会话 allow/disallow 不同用户的某些路由。
我知道我可以在条件路由上使用会话:
const express = require('express');
const Router = require('express').Router;
const router = new Router();
const session = require('express-session');
const sessioning = session({...});
router.post('/login', sessioning, (req, res) => {
});
但这不是我想要做的。即使登录尝试失败,这也会启动一个会话。
我想做的是仅在成功登录尝试后启动会话:
const express = require('express');
const Router = require('express').Router;
const router = new Router();
const session = require('express-session');
router.post('/login', (req, res) => {
/* ... Login validations */
if (login === 'success'){
/* ... start session */
}
res.json({...});
});
这样我就可以禁止未经身份验证的用户访问受保护的路由:
router.get('/protected', (req, res) => {
if (!req.session){
res.status(401);
res.end();
return;
}
/* ... */
});
如果我直接在受保护的路由上设置会话,那么它无法验证用户是否登录。
任何人都可以指出正确的方向吗?
这并没有回答您的主要问题,而是解决了您的(看似)主要问题:
If I set session directly on protected routes, then it can't verify whether or not a user is logged in.
您可以附加一个变量到req.session
对象来检查用户是否登录。
在您的 login
路线中设置 loggedIn
状态
router.post('/login', (req, res) => {
/* ... Login validations */
if (login === 'success'){
req.session.loggedIn = true;
}
// ...
});
并设置一个中间件来检查用户是否登录并保护您的路由。
function checkLoggedIn(req, res, next) {
if (req.session.loggedIn)
next();
else
res.redirect('/login')
}
// Your protected route
router.get('/protected', checkLoggedIn, (req, res) => {
// ...
});