【发布时间】:2012-03-05 05:07:02
【问题描述】:
我正在编写一个基于 Express.js 的应用程序,同时使用 Everyauth 进行身份验证。
为了初始化everyauth,我使用:
app.use(everyauth.middleware());
我想对某些路由绕过身份验证。 具体来说,我注意到每个请求都会调用 findUserById,我想在某些路由中跳过它(例如,对 /getImage 没有身份验证)。
这可能吗?
【问题讨论】:
我正在编写一个基于 Express.js 的应用程序,同时使用 Everyauth 进行身份验证。
为了初始化everyauth,我使用:
app.use(everyauth.middleware());
我想对某些路由绕过身份验证。 具体来说,我注意到每个请求都会调用 findUserById,我想在某些路由中跳过它(例如,对 /getImage 没有身份验证)。
这可能吗?
【问题讨论】:
您可以手动包装everyauth.middleware() 回调。
var auth = everyauth.middleware();
app.use(function(req, res, next) {
if (shouldAuthRequest(req)) {
// call auth, as if it was part of the route
auth(req, res, next);
} else {
// ignore auth
next();
}
});
这不过是一个包装好的中间件。
【讨论】:
从 0.4.5 开始,everyauth.middleware 必须使用 Express 的 app 对象调用。因此,您可以通过这种方式创建一个封装的中间件:
var my_auth_middleware = function(app) {
var auth = everyauth.middleware(app);
// a custom middleware wrapping everyauth
var middleware = function(req, res, next) {
if (shouldAuthRequest(req)) {
// go through the everyauth middleware
auth(req, res, next);
} else {
// bypass everyauth
next();
}
};
// these allow the middleware to be "mounted" by Express
middleware.set = true;
middleware.handle = middleware;
middleware.emit = auth.emit;
// return our custom middleware
return middleware;
};
然后将包装好的中间件添加到堆栈中
app.use(my_auth_middleware(app));