【问题标题】:Passport js + Express js: allow access to public pagesPassport js + Express js:允许访问公共页面
【发布时间】:2014-07-08 12:09:24
【问题描述】:

我正在开发一个网络应用程序,我需要允许用户浏览各种公共页面,如登录、注册、博客等。但是,要查看他的帐户详细信息,他需要登录。我正在使用护照 js 进行身份验证。这是一个快速的 js 应用程序。

我在 express 中使用中间件中断来检查用户是否已登录以呈现适当的页面,如下所示:

app.use(function(req, res, next) {

      if(req.isAuthenticated()) {
        next();
      } else {
        res.render('partials/unauth');
      }
   })

基本上,在这里我是说如果用户已登录,则呈现用户请求的任何页面,否则向他显示一个页面,上面写着:未经授权或页面不存在。

但是,我想在规则中添加一些例外,说如果 req 是 partials/blog(这是一个不需要登录的公共页面),则显示博客页面。我怎样才能做到这一点?

【问题讨论】:

    标签: express passport.js


    【解决方案1】:

    现在可能已经晚了,但几个月前我确实设法通过以下方法解决了这个问题:

    var publicPages = ['signup', 'login', 'error', 'forgotpassword', 'unauth', '404'];
    var privatePages = ['dashboard', 'account'];
    //name is the page requested
    if(publicPages.indexOf(name)!=-1 || privatePages.indexOf(name)!=-1 && req.isAuthenticated()) {
      res.render('partials/'+name);
    } else if(publicPages.indexOf(name)==-1 && privatePages.indexOf(name)==-1) {
      res.render('partials/404')
    } else {
      res.render('partials/unauth');
    }
    

    【讨论】:

      【解决方案2】:

      创建中间件:authenticatedOrGuest.js

      const passport = require('passport');
      
      module.exports = function (req, res, next) {
        // in this sample used jwt strategy, but you can use any
        return passport.authenticate('jwt', { session: false }, function (err, user) {
          if (err) return next(err);
          if (user) req.user = user;
          next();
        })(req, res, next);
      };
      

      然后在应用路由中使用:app.js

      const authenticatedOrGuest = require('./middleware/authenticatedOrGuest.js');
      
      app.get('/my-api-endpoint', authenticatedOrGuest, function(req, res) {
        let message;
        if(req.user) {
          // here logic for authenticated user
          message = 'Authenticated!';
        } else {
          // here logic for guest
          message = 'Guest!';
        }
        res.send(message);
      });
      

      【讨论】:

        【解决方案3】:

        您应该将此身份验证代码保存在如下函数中:

        function isLoggedIn(req, res, next){
              if(req.isAuthenticated()) {
                return next();
              } else {
                res.render('partials/unauth');
              }
        };
        

        假设您希望用户在路由被命中时登录,那么您应该将此函数作为参数传递给路由。

        app.get('/viewDetails', isLoggedIn, function(req, res){
        });
        

        如果你不关心用户是否登录,那么你不应该将此函数作为参数传递给路由。

        app.get('/blog', function(req, res){
        });
        

        【讨论】:

        • 嗯...我知道这种方法。但是,我认为这种方法具有更高的错误概率,因为我可能忘记对私有页面使用 isLoggedIn 函数。由于公共页面的数量较少,我在想是否将其保留在中间件中会更容易。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-04
        • 1970-01-01
        • 2017-03-15
        • 2011-07-31
        • 2022-07-30
        • 2018-07-07
        相关资源
        最近更新 更多