我将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(如果使用核心路由器)。

09-13 00:27