HapiJS中基于角色的身份验证

时间:2015-03-14 18:58:53

标签: javascript node.js hapijs

我正在开发一个用HapiJS编写的rest API第一个项目。 在登录过程之后,用户获得一个令牌以传递每个请求的标头。 用户具有不同的角色(管理员,标准,访客,合作伙伴),并且只有具有特定角色的用户才能访问某些Api端点。 有人可以帮助我以一种很好的方式定义这个检查,所以不必每次都在路线内写检查吗?

1 个答案:

答案 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']
        },
    }
    ...
});

现在,只有使用useradmin范围进行身份验证的用户才能访问该路由。

<强>过程

  1. 决定某些范围(管理员,超级用户,访客等)
  2. 配置身份验证例程,以便在用户凭据上正确设置scope
  3. 通过将config.auth.scope设置为允许访问它的任何人
  4. 来配置路由

    可运行示例

    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');
        });
    });
    
相关问题