【问题标题】:Changing and saving a redirect with Passport.js in different circumstances在不同情况下使用 Passport.js 更改和保存重定向
【发布时间】:2018-03-17 11:49:42
【问题描述】:

我正在编写一个网站,使用 express 和 passport 进行身份验证(以及 mongodb 作为数据库),我知道如何对用户进行身份验证以及如何限制某些页面,以便只有登录用户才能访问它们。但我有一个问题在任何地方都找不到答案:

如果用户尝试访问受限网页并且它注意到用户没有使用 req.isAuthenticated() 登录,它会将用户重定向到登录页面,然后当用户登录时将用户重定向到他们的个人资料页。通常这很好,但在这种情况下,用户试图转到另一个不是个人资料页面的受限页面。

当他/她尝试登录时,我如何将用户重定向到个人资料页面,但当他/她只是尝试访问受限制的页面时,要求他/她登录,然后将他/她重定向到该页面他/她试图访问?

【问题讨论】:

    标签: javascript node.js authentication passport.js


    【解决方案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 表单中添加不可见字段...它需要做很多工作,而且它不是一个好的解决方案....
    猜你喜欢
    • 2012-05-22
    • 2013-08-11
    • 1970-01-01
    • 2018-04-07
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多