如何验证在Hapi JS中提供静态文件的URL

时间:2015-09-24 09:56:46

标签: javascript node.js hapijs

我有一条如下的路线,用于静态页面:

{
     method: 'GET',
     path: '/webapp/{param*}',
     config: {
         handler: {
             directory :{
                 path : Path.join(__dirname, '../../webapp/'),
                 index: true
             }
         }
     }
  }

因此,我想在用户访问该网址"/webapp/#blabla"之前检查用户是否已登录。 用户只有在用户登录时才能访问该URL。

我尝试在上述路线中添加pre选项,但没有运气。

 {
     method: 'GET',
     path: '/webapp/{param*}',
     pre:[{method:checkUrl, assign:'m1'}],
     config: {
         handler: {
             directory :{
                 path : Path.join(__dirname, '../../webapp/'),
                 index: true
             }
         }
     }
  }

checkUrl函数如下:

var checkUrl = function(request, reply) {
     if (!request.auth.isAuthenticated) {
       // redirect to login page     
       reply.redirect('/login');
     }
     return true;
}

为什么我无法重定向到登录页面?

1 个答案:

答案 0 :(得分:1)

这取决于您使用的是哪个身份验证方案,但同样的原则适用。以下是使用hapi-auth-basicadapted from the example in the README)的示例:

var Bcrypt = require('bcrypt');
var Hapi = require('hapi');
var Path = require('path');
var Inert = require('inert');

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

var users = {
    john: {
        username: 'john',
        password: '$2a$10$iqJSHD.BGr0E2IxQwYgJmeP3NvhPrXAeLSaGCj6IR/XU5QtjVu5Tm',   // 'secret'
        name: 'John Doe',
        id: '2133d32a'
    }
};

var validate = function (request, username, password, callback) {

    var user = users[username];
    if (!user) {
        return callback(null, false);
    }

    Bcrypt.compare(password, user.password, function (err, isValid) {

        callback(err, isValid, { id: user.id, name: user.name });
    });
};

server.register([
    require('inert'), 
    require('hapi-auth-basic')
], function (err) {

    server.auth.strategy('simple', 'basic', { validateFunc: validate });

    server.route({
        method: 'GET',
        path: '/webapp/{param*}',
        config: {
            auth: 'simple',            // THIS IS THE IMPORTANT BIT
            handler: {
                directory :{
                    path : Path.join(__dirname, 'files'),
                    index: true
                }
            }
        }
    });

    server.start(function (err) {

        if (err) {
            throw err;
        }

        console.log('Server started!');
    })
});

重点是将auth属性添加到具有策略名称的路由配置中。它与您对任何路线的操作相同。阅读this tutorial,可能会为您清除它。

您能够根据自己的需求进行调整吗?