2015-03-14 2 views
12

Я работаю над первым проектом API для отдыха, написанным с помощью HapiJS. После процесса входа пользователь получает маркер для передачи в заголовке каждого запроса. Пользователи имеют разные роли (admin, standard, guest, partners), а некоторые конечные точки Api доступны только пользователям с определенной ролью. Кто-то может помочь мне в определении этой проверки в хорошем смысле, поэтому, не записывая проверку каждый раз внутри маршрута?Аутентификация на основе ролей в HapiJS

ответ

23

Прицелы

Вы можете использовать scopes в Хапи. При аутентификации запроса путем проверки заголовка, вы можете установить scope свойства учетных данных пользователя:

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

    ... // Your logic here 

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

При определении маршрута вы можете установить scopes, которые разрешено к этой конечной точке в config.auth.scope собственности:

server.route({ 
    ... 
    config: { 
     auth: { 
      strategy: 'simple', 
      scope: ['user', 'admin'] 
     }, 
    } 
    ... 
}); 

Теперь только пользователи, прошедшие проверку подлинности в диапазоне user или admin, смогут получить доступ к этому маршруту.

Процесс

  1. Принятие решения о некоторых областях (администратор, суперпользователя, гостевых и т.д.)
  2. Настройте процедуру аутентификации, чтобы правильно установить scope учетные данные пользователя
  3. Настройте маршруты, установив config.auth.scope К К нему разрешен доступ

Runnable Пример

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

где вы получите возврат обратного вызова validateFunc я имею в виду в обработчике или где? Я хочу получить результат validateFunc в случае неявного API, созданного модулем Rest-Hapi. Кроме того, проверьте: - https://stackoverflow.com/questions/44546596/how-to-get-result-of-validatefunc- в-заранее из-авто созданных-апи-Rest-Хапи –

Смежные вопросы