1

Express、Angular.JS、および ACL のノード モジュール connect-roles で Node.JS を使用しています。user.status が "Platinum" のユーザーが "Platinum" にアクセスできるようにしたいのですが、"Gold" にはアクセスできず、その逆も同様です。

/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');
});
4

1 に答える 1

1

サーバー側で (エクスプレスを使用して) ルートを構成する方法が正しくありません。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代わりに、最初に投稿するルートなど、サーバーが処理するルートと、静的ファイルを取得する方法を定義する必要があります ( /pubURL ですべてのプレフィックスを付けることをお勧めします)。次に、ルートが一致しない場合にページを返すには、この回答の手法のようなことを行う必要があります。index.html

そうすれば、ユーザーが を入力http://localhost:port/Goldすると、express は に対してルートが定義されていないことを確認する/Goldため、 が返されindex.html、AngularJS が読み込まれ、Angular アプリが実行され、URL が参照され、ルートのいずれかと一致するかどうかが確認されます。 AngularJS アプリが構成されています。構成されている場合は、そのページのパーシャルをフェッチして、 ng-view(コア ルーターを使用している場合)に挿入します。

于 2015-03-20T03:27:49.560 に答える