【问题标题】:How to make Express routes require authentication by default?如何使 Express 路由默认需要身份验证?
【发布时间】:2016-02-01 15:57:58
【问题描述】:

我已经看到很多示例,说明如何将身份验证中间件添加到某些需要限制为登录用户的路由(暗示默认是允许任何人访问页面),但我不知道如何使所有路由默认都需要登录,并在匿名用户应该可用的路由中选择性地选择某些路由。

有什么办法让它像这样工作吗?我正在使用 Express 4。

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    我会使用:https://github.com/expressjs/session,一旦用户通过身份验证,您就可以在控制器中检查处理 express 路由的有效会话。

    更新答案

    这就是我将如何登录控制用户

    /**
     * Module dependencies
     */
    
    var express = require('express'),
      http = require('http'),
      session = require('express-session'),
      app = module.exports = express();
    
    /**
     * Configuration
     */
    
    // all environments
    app.set('port', process.env.PORT || 3000);
    app.set('trust proxy', 1);
    app.use(session({
      secret: 'keyboard cat',
      resave: false,
      saveUninitialized: true,
      cookie: {
        secure: true
      }
    }));
    
    
    function checkUserLoggedIn(req, res, next) {
      return req.session;
    }
    /**
     * Routes to control by default is logged in with a regular expression
     */
    app.get('/user/:use_id/*', function (req, res, next) {
      if (checkUserLoggedIn(req)) {
        console.log('User logged');
        next();
      } else {
        console.log('error');
      }
    });
    /**
     * User Home
     */
    app.get('/user/:use_id/home/', function (req, res, next) {
      if (checkUserLoggedIn(req)) {
        console.log('User logged goes to home');
        next();
      } else {
        console.log('error');
      }
    });
    
    
    /**
     * Home for user that is actually logged
     */
    app.get('/guest/dashboard', function (req, res, next) {
      console.log('This is guest dashboard');
    });
    
    /**
     * Home for user that is actually logged
     */
    app.get('/guest/home', function (req, res, next) {
      console.log('This is guest home');
    });
    
    
    /**
     * Start Server
     */
    http.createServer(app).listen(app.get('port'), function () {
      console.log('Express server listening on port ' + app.get('port'));
    });
    

    然后运行

    $ node app.js

    转到浏览器并访问http://localhost:3000/home

    您定义的用于控制“/*”的正则表达式正在获取所有默认路由,然后转到下一个匹配的路由,即 /home。

    这是一种方法,可能有更好、更清晰的方法来解决这个问题。在正则表达式中,您可以控制默认路由的含义以及每种情况的具体含义。

    【讨论】:

    • 似乎这种情况与此类似:stackoverflow.com/questions/18739725/… 最后你不需要 cujojs/meld,因为它在这个相关问题中有所解释。
    • 但是你写的这个中间件放在需要保护的路由上吧?我在询问是否将默认设置为要求所有路由都受到保护,并且只对不需要保护的路由进行例外处理。
    • 我添加了一些示例代码,您可以控制所有路由的默认值,您可以使用 reg exp 定义自己的默认条件。会话的控制非常简单,但你也可以在这种情况下输入你想要的条件。
    • 谢谢,所以如果你想为你的示例添加一些额外的路由,非登录用户可以访问,你会怎么做?我能想到的唯一方法是 /* 路由模式需要从其模式中专门排除每个不受保护的路由,这似乎很乏味。
    • 你是对的,拥有包含和排除某些服务的路由将非常乏味,这对于客户端的消费也是不利的。我认为提供某种方式来区分这两种情况将是一个不错的选择。 /user/:user_id/* 将匹配用户的所有内容和您将阅读为“特定 id 用户的服务主页”的服务 /guest/* 将匹配用户的所有内容以及您将阅读为“访客的服务”的服务某些事情。”希望对您有所帮助,如果您发现了更好的方法,请分享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多