2015-04-16 20 views
5

Sto costruendo un'app angolare con un backend sails.js. Ho incorporato questa autenticazione JWT nell'app.
https://github.com/Foxandxss/sails-angular-jwt-exampleAutenticazione JWT in angolare - Livelli multipli di autenticazione

sto ancora esplorando esattamente come le opere di autenticazione e attualmente sto cercando di capire come aggiungere più livelli di autorizzazione. Viene fornito preconfigurato con 0 e 1 e voglio aggiungere un livello di amministrazione sopra quello.

Gestisce i livelli di autorizzazione esistenti come segue: A ogni percorso viene assegnato un livello di autorizzazione, tramite una costante. Così tutte le rotte di utenti ottengono questa proprietà di accesso assegnato alla proprietà data in stato di:

$stateProvider 
      .state('user', { 
      abstract: true, 
      template: '<ui-view/>', 
      data: { 
       access: AccessLevels.user 
      } 
      }) 

L'AccessLevels.user è tirato da una costante coppia chiave-valore:

angular.module('app') 
    .constant('AccessLevels', { 
     anon: 0, 
     user: 1 
    }); 

Ogni volta che un calcolo del percorso avviene a, controlla la proprietà data.access per vedere qual è il livello di accesso per quella particolare rotta. Se ritorna come una route che richiede l'autenticazione, controlla localStorage per un token. Se c'è un token, il percorso procede, altrimenti ti si avvia.

Ecco la funzione che viene chiamato stateChangeStart:

authorize: function(access) { //<- 'access' will be whatever is in the data property for that state 
     if (access === AccessLevels.user) { 
      return this.isAuthenticated(); // <- this just grabs the token 
     } else { 
      return true; 
     } 
     } 

Allora, qual è il modo più semplice per aggiungere un ulteriore livello?
Ovviamente ho bisogno di inserire il valore auth_level nel modello utente. Ma allora cosa? Quale sarebbe il modo migliore per aggiungere questa funzionalità e mantenere l'integrità dell'autenticazione esistente (sono preoccupato per la sicurezza)?

risposta

1

In primo luogo, Erik Gillespie mi ha guidato nella giusta direzione. Grazie!

Qui ci sono alcune cose che dovevo fare per aggiungere un ulteriore livello di autenticazione per il mio angolare/vele app:

  • ho dovuto aggiungere un campo di 'livello' per il mio modello utente. Il modulo di autenticazione che sto usando aveva già alcune variabili impostate per utenti anonimi (0) e utenti regolari (1). Così ora il mio modello utente memorizza se sei di livello 1 o livello 2.
  • Ho dovuto aggiornare la costante correlata nell'app angolare a cui viene fatto riferimento quando si eseguono alcune operazioni di autenticazione. Ho appena aggiunto admin: 2 all'elenco esistente di tipi di utenti.
  • Ho dovuto utilizzare un reclamo privato nel mio JWT per memorizzare il livello degli utenti nel loro token di sessione. Questo è necessario per confermare che l'utente abbia effettivamente l'autorità che dice di avere ogni volta che tenta di fare qualcosa (di solito CRUD). Il loro livello di autorità viene verificato rispetto al livello di autorizzazione memorizzato nel loro token. Il che porta alla prossima cosa che dovevo fare ...
  • Ho dovuto creare due criteri. Sails ha una struttura di configurazione chiara in cui nella tua API puoi creare middleware (li chiama policy). Basta riempire la cartella delle politiche con tutto il middleware che potrebbe essere necessario. Quindi nella cartella di configurazione di sails, esiste un file policies.js corrispondente in cui è possibile assegnare il middleware a ciascuna funzione specifica di ciascun controller. Molto bello Così ho creato un middleware che controlla per assicurarsi che un utente sia il livello di autorità che dicono di essere, e un altro per assicurarsi che siano admin (se stanno cercando di fare cose amministrative). Quindi ho appena aggiunto il middleware appropriato alle funzioni che volevo limitare.
  • Se una persona ha effettuato l'accesso, ho due dashboard separati e alcune pagine a cui gli utenti normali non possono accedere. Così angolare ha bisogno di controllare se sei amministratore o solo un utente e indirizzarti alla dashboard appropriata, per esempio. Piuttosto che pasticciare con la mia navigazione, ho creato una funzione come questa in app.run:
    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { 
     
          if (toState.url == '/dashboard') { 
     
          var dash = Auth.level(); // <- this is a service I made that checks the users level and returns the appropriate state to go to for that user 
     
          event.preventDefault(); 
     
          $state.go(dash); 
     
          }
    ho aggiunto tutto ciò percorsi erano appropriati per ogni tipo di utente, e poi quando ha colpito che url li spinge a quello giusto . Anche i miei percorsi hanno un oggetto dati ad essi collegato che specifica il livello necessario per l'accesso. Quindi controlla il livello degli utenti contro quello per assicurarsi che possano anche andare a quella parte dell'app o meno. Questo viene gestito con una funzione stateChangeStart simile.
2

È possibile utilizzare private claims per conservare le autorizzazioni concesse dal server. Le attestazioni private ti consentono di inserire qualsiasi altro tipo di dati in JWT che desideri.

Non ho mai utilizzato node-jsonwebtoken (che sembra essere ciò che sails.js utilizza per JWTs), ma sembra che si possa lavorare direttamente con il payload JWT per accedere ai valori che ci si aspetterebbe di essere presenti, quindi potrebbe fare qualcosa di simile:

// Assign authorization on server after successful authentication of an admin 
token.auth = AccessLevels.admin; 

// Read authorization on client 
authorize: function(access) { 
    if (access === AccessLevels.anon) { 
     return true; 
    } 
    // Assumes the JWT token is returned by isAuthenticated() 
    // (Sorry, not familiar with Sails.js or the JWT example) 
    return this.isAuthenticated().auth === access; 
} 

Dopo l'autenticazione, ogni richiesta successiva dovrebbe verificare l'autorizzazione dell'utente, nonché, probabilmente, con l'aggiunta di una politica Oltre simile a "tokenAuth" nell'esempio che hai fornito, ma che verifica la pretesa auth sul JWT fornito corrisponde l'autorizzazione richiesta per invocare qualsiasi funzione sta per essere chiamata.

+0

Quindi vedo che il controller di autorizzazione lato server, in caso di login riuscito, restituisce l'oggetto utente e una coppia chiave-valore token. Il token contiene il valore del metodo sign, con un payload di '{sid: user.id}'. Stai dicendo che posso cambiarlo in '{sid: user.id, auth_level: user.auth_level}'? – tpie

+0

Sì. Le affermazioni di un JWT sono fondamentalmente una mappa e JWT definisce alcune coppie chiave/valore specifiche (iss, sub, aud, exp, nbf, iat, jti) ma consente anche di aggiungere altre dichiarazioni definite dal produttore/consumatore. La maggior parte delle librerie supporta anche l'aggiunta di attestazioni arbitrarie e, con JavaScript, le attestazioni sono di solito una mappa che puoi semplicemente aggiungere e assegnare valori. –

Problemi correlati