2015-05-08 17 views
5

Pracuję nad aplikacją MEAN z uwierzytelnianiem przy użyciu tokenów internetowych JSON. zasadniczo na każdym wniosku sprawdzam, czy użytkownik ma ważny token. jeśli tak, mogą przejść do trasy, w przeciwnym razie wracają do strony logowania.Node.js/Angular.js Uprawnione trasy administratora

Chcę, aby określone trasy/admin/etc ... były dostępne tylko dla zalogowanych użytkowników, którzy są również administratorami. Ustawiłem flagę isAdmin w mongo. Jestem nowy dla nodejs i zastanawiam się, jaki jest najlepszy sposób, aby to sprawdzić. Czy robię to po kątowej stronie w trasach? Czy mogę w jakiś sposób utworzyć tokeny oparte na uprawnieniach podczas uwierzytelniania? Dla porównania, mam następujący kod od średniego książki Machine, zwłaszcza tutaj -

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

Odpowiedz

2

pierwsze, decyzje o autoryzacji musi być wykonane po stronie serwera. Zrobić to po stronie klienta w Angular.js, jak sugerujesz, jest również dobrym pomysłem, ale ma to na celu tylko poprawę komfortu użytkownika, na przykład nie pokazywanie użytkownikowi łącza do czegoś, do czego nie ma dostępu.

Z JWTs, można osadzić roszczeń o użytkowniku wewnętrznym tokenu, tak:

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

Aby uprawnieniami map wyrazić trasy, można użyć connect-roles budować czyste i czytelne funkcje middleware autoryzacji. Załóżmy na przykład Twój JWT jest wysyłany w nagłówku HTTP i masz następujący (naiwne) middleware pozwolenia:

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

z tym, można egzekwować swoją politykę wydawania zezwoleń na trasach, na przykład:

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(); 
}) 

Należy zauważyć, że jest znacznie więcej opcji wydawania & sprawdzania poprawności JWT, takich jak express-jwt, lub przy użyciu passport w połączeniu z passort-jwt