如何用护照保护快递中的静态文件夹

时间:2014-01-24 15:03:38

标签: node.js express passport.js

我有一个基于快递的项目,需要基于护照的身份验证。

后台是一个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);

公用文件夹包含登录页面。

我怎么能实现这个目标?

4 个答案:

答案 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'))]);