Ролевая аутентификация в HapiJS

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

12 голосов | спросил Jack 14 MarpmSat, 14 Mar 2015 21:58:52 +03002015-03-14T21:58:52+03:0009 2015, 21:58:52

1 ответ


0

Прицелы

Вы можете использовать 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 для тех, кому разрешен доступ к нему

Пример выполнения

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');
    });
});
ответил Matt Harrison 14 MarpmSat, 14 Mar 2015 23:35:38 +03002015-03-14T23:35:38+03:0011 2015, 23:35:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132