限制对所有路线的访问权限
我开始尝试使用ExpressJS + AngularJS,我遇到了一个压力的情况。
我的目标是拥有一个login页面和一个仪表板页面,并使用Passport + MongoDB我将对用户进行身份validation,如果凭据正确,则将其redirect到仪表板页面。
我已经开始使用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); };
除了我可以直接访问仪表板的部分(根本不login)之外,login系统工作正常。
所以我想我需要弄清楚在授予用户访问仪表板(或任何其他方面)之前,用户是否已通过身份validation。
我发现这是诀窍:
function ensureAuthenticated(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect('/login'); }
我会在每一个GET
的部分调用它
app.get('/partials/:name', ensureAuthenticated, routes.partials);
这里最大的问题是,login视图也是一个局部的,我不希望当这是请求的视图ensureAuthenticated
运行。
当前调用ensureAuthenticated
每个部分请求的ensureAuthenticated
崩溃任何浏览器,没有任何错误。
我到目前为止所尝试的(并没有工作):
function ensureAuthenticated(req, res, next) { if ( req.route.params.name !== 'login' && req.isAuthenticated() ) { return next(); } res.redirect('/login'); }
也尝试调用login视图与自己的app.GET
而不是使用ensureAuthenticated
但不知何故Angular翻转,甚至不加载。
任何想法如何解决这个问题?
提前致谢。
目前还不清楚第一个(未经修改的) ensureAuthenticated
版本是否ensureAuthenticated
您的浏览器崩溃,或者是最后一个版本(您在ensureAuthenticated
检查/partials/login
),尽pipe不pipe怎样,都不应该发生(如果“崩溃”意思是“摊位”,这是一个明确的expression不回复的回应)
但是作为一种替代方法,试试这个:
app.get('/partials/login', routes.partials); app.get('/partials/:name', ensureAuthenticated, routes.partials);
您的routes.partials
必须显式检查是否要求login路由,因为在这种情况下, name
参数将不会存在于req.params
。
只是为了确保:你是否还有一个用于/login
的服务器端处理程序? 否则, res.redirect('/login')
将不起作用。
我不认为服务器端在XHR请求redirect是一个很好的做法。 如果用户没有被授权,XHR请求应该返回401,并且客户端(Angular)应该采取行动显示通知消息并且redirect用户到login部分。 看看这个项目来处理这样的请求。 有演示和博客文章 。
- 用户在Firebase / Node.js中全局logging
- 产品生态系统中的身份validation和授权
- 用户和来宾两个不同的模板? 或者dynamic改变视图使用客户端variables?
- 要求Passport.js / Node.js目录(除了一个页面)的身份validation?
- Sails.js Waterlock如何覆盖login操作(如何编写自定义login操作)
- 使用passport.js在node.js中进行身份validation后,redirect到上一页
- Passport.js可选authentication
- 多个Firebases实例
- 如何向Google Analytics报告API v4进行身份validation