我将Node.JS与Express,Angular.JS和ACL的节点模块connect-roles一起使用。我想允许user.status为“ Platinum”的用户访问“ Platinum”,但不能访问“ Gold”,反之亦然。
我有ACL部分,如果我在导航栏中输入/ Platinum,则无法访问/ Gold,但是当我尝试访问/ Platinum时,我只能获取模板,而不能获取根外壳,因此,结果是这样的:
You made it!
You have the {{status}} status!
如果我单击与/ Platinum成角度的链接,则一切正常。如果我在导航栏中输入任何中性地址,则一切正常。
这应该很容易解决,但是我还没有弄清楚。
这是设置授权的代码,我很确定这里的一切都可以。
ConnectRoles = require('connect-roles')
var user = new ConnectRoles({
failureHandler: function(req, res, action){
var accept = req.headers.accept || '';
res.status(403);
if(accept.indexOf('html')) {
res.render('access-denied', {action: action});
} else {
res.send('Access Denied - You don\'t have permission to: ' + action);
}
}
});
var app = express();
app.use(user.middleware());
// Setting up user authorizations,
// i.e. if req.user.status = "Platinum", they are given Platinum status
user.use('Platinum', function(req) {
if (req.user.status == 'Platinum') {
return true;
}
});
user.use('Gold', function(req) {
if (req.user.status == 'Gold') {
return true;
}
});
user.use('Admin', function(req) {
if (req.user.status == 'Admin') {
return true;
}
});
设置授权,现在问题就在于路由。
app.post('/login', passport.authenticate('local',
{ successRedirect: '/', failureRedirect: '/login' }));
app.get('/Platinum', user.is('Platinum'), function(req, res) {
//Obviously the code below is wrong.
res.render('templates/support/Platinum');
});
app.get('/Gold', user.is('Gold'), function(req, res) {
res.render('templates/support/Gold');
});
最佳答案
您在服务器端配置路由的方式(使用Express)不正确。对于像AngularJS这样的单页面应用程序,您需要对客户端上的页面进行所有路由(即在Angular中)。不过,服务器仍然为API请求(例如获取和发布数据)和静态资源(index.html,部分HTML文件,图像,javascript,字体等)定义路由。
因此,以下代码在您的服务器端JS中是错误的:
app.get('/Platinum', user.is('Platinum'), function(req, res) {
//Obviously the code below is wrong.
res.render('templates/support/Platinum');
});
app.get('/Gold', user.is('Gold'), function(req, res) {
res.render('templates/support/Gold');
});
只需删除这些行。
相反,您需要定义服务器将处理的路由,例如
/login
首先发布一个路由,以及如何获取静态文件(我建议在URL中以/pub
作为前缀)。然后,如果没有匹配的路由,则需要执行like the technique in this answer操作以返回index.html
页面。这样,当用户键入
http://localhost:port/Gold
时,express将看到没有为/Gold
定义的路由,因此它将返回index.html
,这将加载AngularJS,运行Angular应用,然后查看URL和查看与您的AngularJS应用配置的路由是否匹配,如果匹配,则获取该页面的部分内容,并将其插入您的ng-view
(如果使用核心路由器)。