我有一个基于快递的项目,需要基于护照的身份验证。
后台是一个angularjs应用程序,作为静态文件。
我的身份验证代码完全基于https://github.com/jaredhanson/passport-local/blob/master/examples/express3-no-connect-flash/app.js
如果未经过身份验证,则不要提供角度应用程序。我尝试在/ admin路由上添加ensureAuthenticated,但它使路由不起作用(404)。删除ensureAuthenticated后,将提供/ admin。
app.use(express.static(path.join(__dirname, 'public')));
app.use('/admin', ensureAuthenticated, express.static(path.join(__dirname, 'admin')));
//serve routes
app.use(app.router);
公用文件夹包含登录页面。
我怎么能实现这个目标?
答案 0 :(得分:27)
遇到同样的问题,这就是我最终要做的事情!
app.use并不能让你以这种方式链接中间件。各种种类 app.VERB函数可以,但是app.use没有。这是一个中间件 一次。
如果将2个中间件拆分为单独的呼叫,则应该得到 你想要的结果:
app.use('/admin', ensureAuthenticated);
app.use('/admin', express.static(path.join(__dirname, 'admin')));
Cannot use basic authentication while serving static files using express
答案 1 :(得分:18)
您可以使用中间件检查路线,如果他们没有登录并且正在点击管理页面,可以重定向他们,例如(未经测试):
app.use(function(req, res, next) {
if (req.user == null && req.path.indexOf('/admin') === 0)
{
res.redirect('/login');
}
next();
});
答案 2 :(得分:5)
app.use('/admin', function(req,res,next){
if(req.user){
return express.static(path.join(__dirname, 'public'));
} else {
res.render(403, 'login', {message:'Please, login!'});
}
});
//serve routes
app.use(app.router);
答案 3 :(得分:0)
您也可以将中间件链接为一个数组来实现此目标:
app.use('/admin', [ensureAuthenticated, express.static(path.join(__dirname, 'admin'))]);