2014-01-24 86 views
17

我有一个基于护照的基于快递的项目,需要进行身份验证。如何使用护照快递保护静态文件夹

该后台是一个angularjs应用程序作为静态文件。

我的验证码是完全地基于https://github.com/jaredhanson/passport-local/blob/master/examples/express3-no-connect-flash/app.js

要不要服务于应用程序的角度,如果你没有通过认证。我尝试在/ admin路由上添加ensureAuthenticated,但它使路由无法工作(404)。一旦我删除ensureAuthenticated /管理服务。

app.use(express.static(path.join(__dirname, 'public'))); 
app.use('/admin', ensureAuthenticated, express.static(path.join(__dirname, 'admin'))); 
//serve routes 
app.use(app.router); 

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

我怎么能做到这一点?

+1

你能使用的中间件(连接)重定向到登录,如果他们没有登录时点击'/ admin'路由? – MikeSmithDev

+1

这就是我想要做的,但没有成功。如果不是,请确保身份验证重定向登录。但是,有了这个,它没有登录时,但登录时,我有一个404 /管理 – toutpt

+1

我想更多的'app.use(功能(REQ,RES,下一个){如果(!REQ.user))。 ..}' – MikeSmithDev

回答

15

可以使用中间件检查路由和重定向他们,如果他们还没有登录,并且打的管理页面,像(未经测试):

app.use(function(req, res, next) { 
    if (req.user == null && req.path.indexOf('/admin') === 0) 
    { 
     res.redirect('/login'); 
    } 
    next(); 
}); 
+2

这不适用于我。当一个文件夹处于静态路径时,它似乎不会通过app.use路径 –

+0

如果您在其他'app.use'下面添加'static',您的答案对于像我这样的新手来说会更清晰,部分(由'next()'调用),就像[here](https://stackoverflow.com/a/36446697/382515)。我在同一时间学习快递,护照,承诺等。无论如何,谢谢 –

3
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); 
+1

答案看起来很合理,但是为什么它会起作用的解释会有所帮助。 –

+0

e'/ admin'我们装载中间件,由匿名函数定义,返回静态中间件,如果用户对象存在于请求对象中,或者通过呈现403页面并以登录形式停止请求处理。 – vodolaz095

+5

没有为我工作,请求只是没有回应!另外app.use(app.router);在express 4.x中被删除 – Bobz79

19

陶然成同一个问题,这是我最终做了什么!

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

从上面的源代码可以看出:@Mathias编写和编辑 - 从express版本4.x开始,您可以将多个中间件作为数组或两者混合使用到app.use中。现在,使静态文件授权安全: –