2015-05-08 5 views
5

Ich arbeite an einer MEAN-Anwendung mit Authentifizierung mit JSON-Web-Token. Grundsätzlich überprüfe ich bei jeder Anfrage, ob der Benutzer ein gültiges Token hat. Wenn dies der Fall ist, können sie zur Route gehen, andernfalls werden sie zur Anmeldeseite zurückgeleitet.Node.js/Angular.js Admin autorisierte Routen

Ich möchte bestimmte routen/admin/etc ... nur für angemeldete Benutzer, die auch admin sind, zugänglich machen. Ich habe eine IsAdmin-Flagge in Mongo eingerichtet. Ich bin neu bei Nodejs und frage mich, was der beste Weg ist, dies zu überprüfen. Tue ich es auf der eckigen Seite in Routen? Oder kann ich bei der Authentifizierung Berechtigungs-Tokens erstellen? Als Referenz verfolge ich den Code aus dem Mean Machine Buch, insbesondere hier -

https://github.com/scotch-io/mean-machine-code/tree/master/17-user-crm

Antwort

2

Zunächst Zulassungsentscheidungen muss auf der Serverseite durchgeführt werden. Es ist auch eine gute Idee, dies auf der Client-Seite in Angular.js zu tun, wie Sie es vorgeschlagen haben, aber dies dient nur dazu, die Benutzererfahrung zu verbessern, zum Beispiel den Benutzer nicht auf etwas zu verweisen, auf das er keinen Zugriff hat.

Mit JWTs können Sie Ansprüche über den Benutzer innerhalb des Token einbetten, wie folgt aus:

var jwt = require('jsonwebtoken'); 
var token = jwt.sign({ role: 'admin' }, 'your_secret'); 

Um Karte Berechtigungen Routen zum Ausdruck bringen, Sie connect-roles verwenden können saubere und gut lesbare Berechtigungsmiddleware-Funktionen zu bauen. Nehmen wir zum Beispiel Ihre JWT wird im HTTP-Header gesendet und Sie haben die folgende (naive) Genehmigung Middleware:

// Naive authentication middleware, just for demonstration 
// Assumes you're issuing JWTs somehow and the client is including them in headers 
// Like this: Authorization: JWT {token} 
app.use(function(req, res, next) { 
    var token = req.headers.authorization.replace(/^JWT /, ''); 
    jwt.verify(token, 'your_secret', function(err, decoded) { 
     if(err) { 
      next(err); 
     } else { 
      req.user = decoded; 
      next(); 
     } 
    }); 
}) 

Damit können Sie Ihre Autorisierungsrichtlinien auf Strecken durchzusetzen, wie folgt aus:

var ConnectRoles = require('connect-roles'); 
var user = new ConnectRoles(); 

user.use('admin', function(req) { 
    return req.user && req.user.role === 'admin'; 
}) 

app.get('/admin', user.is('admin'), function(req, res, next) { 
    res.end(); 
}) 

Beachten Sie, dass es viel bessere Möglichkeiten gibt, & zur Validierung von JWTs wie express-jwt oder passport in Verbindung mit passort-jwt

auszugeben