2016-01-30 3 views
1

Мне нужно сделать некоторую дополнительную аутентификацию в нескольких моих обработчиках. Есть ли способ сделать это способом?Как я могу составить обработчик Hapijs?

export async function handler(request) { 
    const user = request.auth.credentials; 
    const customer = FindCustomer(user); 
    if (!customer) { 
    throw Boom.forbidden('user is not a customer'); 
    } 
    if (!customer.verified) { 
    throw Boom.forbidden('customer not validated'); 
    } 

    // actual handler logic 
} 

Есть ли способ обернуть это, чтобы некоторые маршруты уже обеспечивали клиента в объекте запроса?

+0

Что Auth плагин вы используете? – ZeMoon

+0

Хотя оба варианта ниже действительны, я просто пошел с проверкой его в коде обработчика. Это кажется очевидным и прямым, serverExtensions, хотя и круто, не очень очевидны для других, читающих код. – sheki

+0

Я бы установил стратегию аутентификации и потребовал их через объект config.auth на маршрутах. – manonthemat

ответ

1

Вы можете использовать extension points в жизненном цикле запроса. В вашем случае точка расширения «onPostAuth» была бы идеальной.

server.ext('onPostAuth', function (request, reply){ 

    const user = request.auth.credentials; 
    const customer = FindCustomer(user); 
    if (!customer) { 
    return reply (Boom.forbidden('user is not a customer')); 
    } 
    if (!customer.verified) { 
    return reply(Boom.forbidden('customer not validated')); 
    } 
    reply.continue(); 
}); 
+0

Это потрясающе. Но как сделать это применимым только к нескольким маршрутам. – sheki

1

Дополняя ответ ZeMoon, вы можете реализовать onPostAuth так:

server.ext('onPostAuth', function (request, reply) { 

    if(request.route.settings.plugins.verifyCustomer) { 

     const user = request.auth.credentials; 
     const customer = FindCustomer(user); 
     if (!customer) { 
      return reply (Boom.forbidden('user is not a customer')); 
     } 
     if (!customer.verified) { 
      return reply(Boom.forbidden('customer not validated')); 
     } 

    } 

    reply.continue(); 
}); 

А затем добавить конфигурацию plugins.verifyCustomer маршруту:

server.route({ 
    method: 'get', 
    path: '/test1', 
    handler: function(request, reply) { 

     // Handler logic here 
    }, 
    config: { 
     plugins: { 
      verifyCustomer: true 
     } 
    } 
}); 
Смежные вопросы