在不同情况下使用Passport.js更改并保存redirect

即时通讯编写一个网站使用快递和通行证进行身份validation(和mongodb作为数据库),我知道我如何可以authentication用户,以及如何限制某些页面,所以只有login的用户可以访问它们。 但我有一个问题,我无法find答案的任何地方:

如果用户尝试访问受限制的网页,并且通知用户未使用req.isAuthenticated()login,则会将用户redirect到login页面,然后当用户login时将用户redirect到他们的个人档案页面。 通常这很好,但在这种情况下,用户试图去到另一个不是个人资料页面的受限制页面。

当他/她尝试login时,如何将用户redirect到configuration文件页面,但当他/她尝试访问受限制的页面时,请求他/她login,然后将其redirect到他/她的页面试图访问?

你可以使自己的中间件类似于下面的来处理该路由上的redirect:

this.ensureAuthenticatedOrSendToLogin = (req, res, next) => { if (req.isAuthenticated()) { return next(); } return res.redirect('/login'); }; 

然后,您可以添加一个字段到会话中以存储来自请求的url的redirectTo: req.session.redirectTo = req.url并在auth之后成功redirect之前login后加载它。

您可以使用简化的版本:

 this.saveRedirect = (req, res, next) => { req.session.redirectTo = req.url; // could pass this in from query too if redirect should be different! return next(); }; this.checkRedirect = (req, res, next) => { const { redirectTo } = req.session; if (redirectTo) { const redirect = redirectTo; req.session.redirectTo = undefined; // reset session field so its not carried out again if you call this without saving again return res.redirect(redirect); } return next(); };