在不同情况下使用 Passport.js 更改和保存重定向
Posted
技术标签:
【中文标题】在不同情况下使用 Passport.js 更改和保存重定向【英文标题】:Changing and saving a redirect with Passport.js in different circumstances 【发布时间】:2018-03-17 11:49:42 【问题描述】:我正在编写一个网站,使用 express 和 passport 进行身份验证(以及 mongodb 作为数据库),我知道如何对用户进行身份验证以及如何限制某些页面,以便只有登录用户才能访问它们。但我有一个问题在任何地方都找不到答案:
如果用户尝试访问受限网页并且它注意到用户没有使用 req.isAuthenticated() 登录,它会将用户重定向到登录页面,然后当用户登录时将用户重定向到他们的个人资料页。通常这很好,但在这种情况下,用户试图转到另一个不是个人资料页面的受限页面。
当他/她尝试登录时,我如何将用户重定向到个人资料页面,但当他/她只是尝试访问受限制的页面时,要求他/她登录,然后将他/她重定向到该页面他/她试图访问?
【问题讨论】:
【参考方案1】:您可以制作类似于下面的自己的中间件来处理该路由上的重定向:
this.ensureAuthenticatedOrSendToLogin = (req, res, next) =>
if (req.isAuthenticated())
return next();
return res.redirect('/login');
;
然后,您可以向会话添加一个字段,以存储带有来自请求的 url 的 redirectTo:req.session.redirectTo = req.url
,并在登录后加载它,然后在身份验证后成功重定向。
您可以使用的简化版本:
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();
;
【讨论】:
谢谢你。看起来是一个很好的解决方案。我找到了一个 rly hacky 解决方案(通过在 html 表单中添加不可见字段),但现在看起来很愚蠢:P。我一有机会就试试看。 另外,不要像我所做的那样通过在 html 表单中添加不可见字段...它需要做很多工作,而且它不是一个好的解决方案....以上是关于在不同情况下使用 Passport.js 更改和保存重定向的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Passport.js 在 Node.js 中重置/更改密码?