我正在开发一个用HapiJS编写的rest API第一个项目。 在登录过程之后,用户获得一个令牌以传递每个请求的标头。 用户具有不同的角色(管理员,标准,访客,合作伙伴),并且只有具有特定角色的用户才能访问某些Api端点。 有人可以帮助我以一种很好的方式定义这个检查,所以不必每次都在路线内写检查吗?
答案 0 :(得分:24)
<强>作用域强>
您可以在hapi中使用scopes
。通过检查标头对请求进行身份验证时,您可以设置用户凭据的scope
属性:
var validateFunc = function (username, password, callback) {
... // Your logic here
return callback(null, true, {scope: 'admin'});
};
定义路线时,您可以在scopes
属性中设置允许该端点的config.auth.scope
:
server.route({
...
config: {
auth: {
strategy: 'simple',
scope: ['user', 'admin']
},
}
...
});
现在,只有使用user
或admin
范围进行身份验证的用户才能访问该路由。
<强>过程强>
scope
config.auth.scope
设置为允许访问它的任何人可运行示例
var Hapi = require('hapi');
var server = new Hapi.Server();
server.connection({ port: 4000 });
server.register(require('hapi-auth-basic'), function (err) {
if(err) {
throw err;
}
server.auth.strategy('simple', 'basic', {
validateFunc: function (username, password, callback) {
if (username === 'admin') {
return callback(null, true, {scope: 'admin'}); // They're an `admin`
}
if (username === 'user') {
return callback(null, true, {scope: 'user'}); // They're a `user`
}
return callback(null, false);
}
});
server.route([{
config: {
auth: {
strategy: 'simple',
scope: ['admin'] // Only admin
},
},
method: 'GET',
path: '/admin',
handler: function(request, reply) {
reply('Admin page');
}
}, {
config: {
auth: {
strategy: 'simple',
scope: ['user', 'admin'] // user or admin
},
},
method: 'GET',
path: '/user',
handler: function(request, reply) {
reply('User page');
}
}
]);
server.start(function () {
console.log('Started server');
});
});