2013-09-09 5 views
17

Я хочу проверить авторизацию пользователей моего веб-приложения, когда они вошли в URL-адрес. Но когда я индивидуально промежуточного проверить авторизацию, это бесполезно для уже существующих маршрутов, таких как:Как использовать промежуточное программное обеспечение для проверки авторизации перед вводом каждого маршрута в экспресс?

function authChecker(req, res, next) { 
    if (req.session.auth) { 
     next(); 
    } else { 
     res.redirect("/auth"); 
    } 
} 

app.use(authChecker); 
app.get("/", routes.index); 
app.get("/foo/bar", routes.foobar); 

authChecker является unabled проверить полномочия пользователей, которые вошли в два адреса. Он работает только для неуточненных URL-адресов.

И я увидел метод, который я могу поставить authChecker между маршрутом и обработчик маршрута, , такие как:

app.get("/", authChecker, routes.index); 

Но как я могу достичь его в простой форме, а не поставив authChecker в каждом маршруте?

Большое спасибо ..

ответ

16

Пока

app.use(authChecker); 

находится перед

app.use(app.router); 

она будет вызвана для каждого запроса. Тем не менее, вы получите «слишком много перенаправлений», потому что его вызывают для ВСЕ МАРШРУТЫ, включая /auth. Так что для того, чтобы обойти эту проблему, я хотел бы предложить изменения функции к чему-то вроде:

function authChecker(req, res, next) { 
    if (req.session.auth || req.path==='/auth') { 
     next(); 
    } else { 
     res.redirect("/auth"); 
    } 
} 

Таким образом, вы не будете перенаправлены на URL аутентификации, а также.

+0

@ kg8gk это разрешает проблему« слишком много переадресаций »? – guydog28

+0

Это действительно сработало. Я поставил authChecker между статическим промежуточным программным обеспечением и app.router, поэтому он не будет проверять статические файлы. –

0

Но когда я индивидуально промежуточного проверить авторизацию, это бесполезно для уже существующих маршрутов

Экспресс будет работать промежуточное программное обеспечение в порядке добавляется к стек. Маршрутизатор является одной из этих функций промежуточного программного обеспечения. Пока вы получаете свой authChecker в стек перед маршрутизатором, он будет использоваться всеми маршрутами, и все будет работать.

Скорее всего, у вас есть маршрутизатор перед authChecker, потому что у вас есть маршруты, определенные до того, как ваш authChecker попадет в стек. Обязательно поместите все свои звонки app.use перед любыми звонками на app.get, app.post и т. Д., Чтобы избежать явного впрыскивания эксплоита эксплоита в стек промежуточного программного обеспечения.

+0

Порядок как код, который я написал, и __authChecker__ работает только для неуказанных URL-адресов, например, «/ test», он перенаправляется на «/ auth», но для «/ foo/bar» это будет отобразить страницу напрямую ... –

+0

Я попытался поставить checker перед 'app.use (app.router)', и он работает для каждого маршрута даже указанных маршрутов, поэтому я не могу получить ни одну из моих страниц, кроме «слишком появилось много переадресаций » –

15

Возможно, есть способы подойти к этой проблеме, но вот что работает для меня.

Мне нравится создавать массив промежуточного программного обеспечения для защищенных и незащищенных маршрутов, а затем использовать, когда это необходимо.

var protected = [authChecker, fetchUserObject, ...] 
var unprotected = [...] 

app.get("/", unprotected, function(req, res){ 
    // display landing page 
}) 

app.get("/dashboard", protected, function(req, res){ 
    // display private page (if they get this far) 
}) 

app.get("/auth", unprotected, function(req, res){ 
    // display login form 
}) 

app.put("/auth", unprotected, function(req, res){ 
    // if authentication successful redirect to dashboard 
    // otherwise display login form again with validation errors 
}) 

Это упрощает расширение функциональных возможностей для каждого уровня промежуточного программного обеспечения путем редактирования массива для каждого типа маршрута. Это также делает функцию каждого маршрута более понятной, поскольку она сообщает нам тип маршрута.

Надеюсь, это поможет.

+4

Как вы справляетесь с ситуацией при наличии большого количества маршрутов, помещаете защищенный/незащищенный массив в каждый маршрут? –

Смежные вопросы

 Смежные вопросы