Я работаю над первым проектом API для отдыха, написанным с помощью HapiJS. После процесса входа пользователь получает маркер для передачи в заголовке каждого запроса. Пользователи имеют разные роли (admin, standard, guest, partners), а некоторые конечные точки Api доступны только пользователям с определенной ролью. Кто-то может помочь мне в определении этой проверки красиво, так что, не записывая проверку каждый раз внутри маршрута?
Проверка подлинности на основе ролей в HapiJS
Ответ 1
Прицелы
Вы можете использовать scopes
в hapi. Когда вы проверяете подлинность запроса, проверяя заголовок, вы можете установить свойство 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
, смогут получить доступ к этому маршруту.
Процесс
- Определите некоторые области (admin, superuser, guest и т.д.)
- Настройте свою процедуру аутентификации, чтобы правильно установить
scope
в учетных данных пользователя - Настройте свои маршруты, установив
config.auth.scope
тому, кому разрешен доступ к нему.
Runnable Example
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');
});
});