2015-03-14 7 views
12

Ich arbeite an einem Rest API-Projekt, das mit HapiJS geschrieben wurde. Nach dem Login-Vorgang erhält der Benutzer ein Token, um den Header jeder Anfrage zu übergeben. Benutzer haben unterschiedliche Rollen (Admin, Standard, Gast, Partner) und einige Api-Endpunkte sind nur für Benutzer mit einer bestimmten Rolle erreichbar. Jemand könnte mir helfen, diesen Scheck auf eine nette Art zu definieren, also ohne den Scheck jedes Mal innerhalb der Route zu schreiben?Rollenbasierte Authentifizierung in HapiJS

Antwort

23

Scopes

Sie können scopes in hapi verwenden. Wenn Sie die Anforderung authentifizieren, indem die Header-Kontrolle, können Sie die scope Eigenschaft der Anmeldeinformationen des Benutzers festgelegt:

var validateFunc = function (username, password, callback) { 

    ... // Your logic here 

    return callback(null, true, {scope: 'admin'}); 
}; 

Wenn eine Route definieren, können Sie die scopes gesetzt, die in der config.auth.scope Eigenschaft zu diesem Endpunkt zulässig:

Jetzt können nur Benutzer, die mit dem Gültigkeitsbereich user oder admin authentifiziert sind, auf diese Route zugreifen.

Prozess

  1. auf einige Bereiche Entscheiden (admin, Super-User, Gast usw.)
  2. Konfigurieren Sie Ihre Authentifizierungsroutine korrekt die scope auf Anmeldeinformationen des Benutzers
  3. Konfigurieren Sie Ihre Routen festgelegt durch die Einstellung config.auth.scope an wen auch immer Zugang erlaubt ist

Runnable Beispiel

var Hapi = require('hapi'); 

var server = new Hapi.Server(); 
server.connection({ port: 4000 }); 

server.register(require('hapi-auth-basic'), function (err) { 

    if(err) { 
     throw err; 
    } 

    server.auth.strategy('simple', 'basic', { 
     validateFunc: function (username, password, callback) { 

      if (username === 'admin') { 
       return callback(null, true, {scope: 'admin'}); // They're an `admin` 
      } 
      if (username === 'user') { 
       return callback(null, true, {scope: 'user'}); // They're a `user` 
      } 
      return callback(null, false); 
     } 
    }); 

    server.route([{ 
      config: { 
       auth: { 
        strategy: 'simple', 
        scope: ['admin']     // Only admin 
       }, 
      }, 
      method: 'GET', 
      path: '/admin', 
      handler: function(request, reply) { 

       reply('Admin page'); 
      } 
     }, { 
      config: { 
       auth: { 
        strategy: 'simple', 
        scope: ['user', 'admin']   // user or admin 
       }, 
      }, 
      method: 'GET', 
      path: '/user', 
      handler: function(request, reply) { 

       reply('User page'); 
      } 
     } 
    ]); 

    server.start(function() { 
     console.log('Started server'); 
    }); 
}); 
+0

, wo Sie die Rückkehr des Rückrufs von validateFunc bekommen meine ich in Handler oder wo? Ich möchte das Ergebnis von validateFunc im Falle von impliziten API von Rest-Hapi-Modul erstellt werden.Oder im Detail überprüfen Sie bitte: - https://stackoverflow.com/questions/44546596/how-to-get-result-of-validatefunc- in-vor-automatisch-erstellt-api-rest-hapi –

Verwandte Themen