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

标签 javascript node.js hapi.js

我有一个服务静态页面的路由如下:

{
     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;
}

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

最佳答案

这稍微取决于您使用的身份验证方案,但适用相同的原则。这是使用 hapi-auth-basic 的示例(adapted 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 ,它可能会为您解决问题。

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

关于javascript - 如何在 Hapi JS 中验证提供静态文件的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32758438/

相关文章:

node.js - 如何修复构建的 Angular 分布在浏览器上显示白屏的问题

javascript - npm install 报错 as '' console.error (`a bug known to break npm. "

hapi.js - hapi-auth-jwt2 : Add custom attribute to error response

javascript - 如何在hapi中获取登录用户的详细信息

javascript - JQuery UI 对话框模式表单在 AJAX 应用程序中缓存旧值

javascript - 将错误抛出到promise.catch之外

javascript - javascript结果的原因是什么?

json - 如何管理多个 JSON 模式文件?

javascript - 允许 Joi 中的可选参数而不指定它们

javascript - JS 超出最大调用堆栈