HapiJs маршрутизирует базу доступа на роль - PullRequest
0 голосов
/ 06 февраля 2019

Я использую HapiJ на стороне сервера и хочу выполнить настройку маршрута на основе роли, я хочу ограничить доступ пользователей к некоторым конечным точкам

var Hapi = require('hapi');

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

server.route({
  method: 'GET',
  path: 'api1',
  handler: function (request, reply) {
    reply('Hello, world!');
  }
});

server.route({
  method: 'GET',
  path: 'api2',
  handler: function (request, reply) {
    reply('Hello');
  }
});

server.route({
  method: 'GET',
  path: 'api3',
  handler: function (request, reply) {
    reply('Hello');
  }
});

const parseHeader = (request, h) => {
   const { role } = JSON.parse(request.headers["roles"]);

};

server.ext("onRequest", parseHeader);

server.start(function () {
  console.log('Server running at:', server.info.uri);
});

Здесь я получаю роль из заголовка ролей, поэтомуроли могут быть «администратор» или «клиент».Если роль - администратор, пользователь может получить доступ ко всем конечным точкам API 'api1', 'api2' и 'api3', но если его "клиент", тогда будет доступен только "api3".

Как добиться такого рода авторизациипо маршрутам?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

hapi.js имеет механизм по умолчанию для этого.Она называется область проверки подлинности .

Определите конфигурацию проверки подлинности вашего маршрута с полем области действия

exports.userList = {
    description: 'list users',
    auth: {
        scope: ['admin]
    },    
    handler: async (request, h) => {
        // .. your code here
    }
};

Это говорит о том, что только пользователь в области администратора может иметь доступ к этому маршруту.

Затем в коде аутентификации добавьте поле области действия к объекту учетных данных.

exports.plugin = {
    async register(server, options) {
        const implementation = function (server, options) {

            return {
                authenticate: function (request, h) {

                    // check user here
                    const user = findInDbOrSomething();
                    if (!user) {                        
                        // redirect user to login page
                        return h.redirect('/auth/login').takeover()
                    }

                    credentials = {
                        name: user.name,
                        email: user.email,
                        scope: ["admin"] // or user.scope if user has a scope field or get it from somewhere else
                    }

                    return h.authenticated({credentials});
                }
            }
        };
        server.auth.scheme('basic', implementation);
        server.auth.strategy('simple', 'basic');
        server.auth.default('simple')
    },
    name: 'auth',
    version: require('../package.json').version
};
0 голосов
/ 06 февраля 2019

вам нужно создать «промежуточное программное обеспечение» - предварительный обработчик, который будет проверять роль пользователя, если роль пользователя - admin, затем продолжить, иначе запретить доступ

var Boom = require('boom');


const CheckAdmin= function (request, reply) {
    const { role } = JSON.parse(request.headers["roles"]);
    if(role=='admin'){
       return reply.continue();
    }else{
       return reply(Boom.unauthorized('Access Denied'));
    }
}



 server.route({
    method: 'GET',
    path: 'api1',
    config: {
         pre: [{ method: CheckAdmin }],
         handler: function (request, reply) {
         reply('Hello, world!');
    }
  });

server.route({
  method: 'GET',
  path: 'api2',
  config: {
         pre: [{ method: CheckAdmin }],
         handler: function (request, reply) {
         reply('Hello, world!');
    }
});

// api3 открыт, все могут его использовать,поэтому нет необходимости добавлять предварительный обработчик здесь

server.route({
  method: 'GET',
  path: 'api3',
  handler: function (request, reply) {
    reply('Hello');
  }
});
...