如何使 Express 路由默认需要身份验证?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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。

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

【讨论】:

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

以上是关于如何使 Express 路由默认需要身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

Node/Express 的 Passport 身份验证中间件 - 如何保护所有路由

如何使用 JWT 在 Express 中验证单个路由(无代码重复)的多种类型用户的身份验证令牌?

如何在使用 Passport 进行社交身份验证后重定向到正确的客户端路由(react、react-router、express、passport)

使用护照进行身份验证后,如何在 React FROM express 中重定向到用户仪表板

什么是对 Express 4 路由器上的某些路由进行身份验证的更好方法?

使用 Express/Passport、AngularJS 和 ensureLoggedIn 的身份验证和路由在“/”url 上不起作用