我有一个服务静态页面的路由如下:
{
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/