2013-06-13 2 views
1

Я начинаю экспериментировать с ExpressJS + AngularJS, и я столкнулся со стрессовой ситуацией.Ограничение доступа ко всем маршрутам, кроме одного

Моя цель - иметь одну страницу входа и одну страницу панели управления и использовать Passport + MongoDB. Я аутентифицирую пользователя и, если учетные данные верны, перенаправляет его на страницу панели мониторинга.

Я начал с angular-express-seed и модифицирован так я закончил с ранее упомянутыми видами:

$routeProvider. 
    when('/login', { 
     templateUrl: 'partials/login', 
     controller: 'LoginCtrl' 
    }). 
    when('/dashboard', { 
     templateUrl: 'partials/dashboard', 
     controller: 'DashboardCtrl' 
    }). 
    otherwise({ 
     redirectTo: '/login' 
    }); 

Я подаю каждый частичный вид с:

app.get('/partials/:name', routes.partials); 


exports.partials = function (req, res) { 
    var name = req.params.name; 
    res.render('partials/' + name); 
}; 

Войти системы работает правильно, за исключением той части, что я могу получить непосредственно на панели управления (без входа вообще).

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

Я нашел, что делает трюк:

function ensureAuthenticated(req, res, next) { 
    if (req.isAuthenticated()) { return next(); } 
    res.redirect('/login'); 
} 

, и я бы назвал это на каждом GET к частичному

app.get('/partials/:name', ensureAuthenticated, routes.partials); 

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

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

То, что я пытался до сих пор (и не работают):

function ensureAuthenticated(req, res, next) { 
     if (req.route.params.name !== 'login' && req.isAuthenticated()) { return next(); } 
     res.redirect('/login'); 
    } 

попытался также вызова вид входа в систему со своим собственным app.GET и не используя ensureAuthenticated но как-то Угловая переворачивается от и не даже нагрузки.

Любые идеи о том, как разрешить это?

Заранее спасибо.

ответ

1

Неясно мне, если первый (немодифицированного) версия ensureAuthenticated врезается свои браузеры, или последнюю версию (в которой вы проверить /partials/login), хотя независимо от того, что не должно произойти (если под грохот ' вы имеете в виду «киосков», это сигнальным знак Экспресс не отправляет обратно ответ)

Но в качестве альтернативы, попробуйте это:

app.get('/partials/login', routes.partials); 
app.get('/partials/:name', ensureAuthenticated, routes.partials); 

Ваш routes.partials действительно должны явно проверить, если он призвал логин, потому что в этом случае параметр name не будет существовать в req.params.

Просто убедитесь, что у вас есть серверный обработчик для /login? В противном случае res.redirect('/login') не будет работать.

+0

добавление app.get ('/ partials/login', routes.partials); и проверка проверки параметров имени. Тем не менее у меня проблема, я зашел в систему и перешел на свою панель инструментов, затем я очищаю сессионный файл cookie и обновляюсь, чтобы узнать, перенаправляется ли он на/login. Он показывает окно входа в систему, но URL-адрес все еще говорит о своей панели управления, любая идея, почему? – mfreitas

+0

Итак, он показывает окно входа в систему, потому что я вернул его в обработчик/login. Не должен res.redirect ('/ login'); перенаправить? вместо этого он переходит к моему app.get ('/ login', routes.login); и возврат res.render ('partials/login'); – mfreitas

+0

@mfreitas перенаправление отправляется во время вызова AJAX, потому что Angular запрашивает частичное. Таким образом, вызов AJAX перенаправляется, а не URL главной страницы. – robertklep

1

Я не думаю, что перенаправление сервера на запрос XHR является хорошей практикой. Запрос XHR должен возвращать 401, если пользователь не авторизован, а клиентская сторона (Угловая) должна принять действие в качестве отображения сообщения уведомления и перенаправления пользователя на частичный вход. Посмотрите на this project для обработки таких запросов. Есть demo и blog post.