【问题标题】:Role based authentication in HapiJSHapiJS 中基于角色的身份验证
【发布时间】:2015-05-17 03:46:42
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js hapijs


    【解决方案1】:

    范围

    您可以在 hapi 中使用scopes。在通过检查header对请求进行身份验证时,可以设置用户凭据的scope属性:

    var validateFunc = function (username, password, callback) {
    
        ... // Your logic here
    
        return callback(null, true, {scope: 'admin'});
    };
    

    定义路由时,您可以在config.auth.scope 属性中设置允许该端点使用的scopes:

    server.route({
        ...
        config: {
            auth: {
                strategy: 'simple', 
                scope: ['user', 'admin']
            },
        }
        ...
    });
    

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

    流程

    1. 确定一些范围(管理员、超级用户、访客等)
    2. 配置您的身份验证例程以正确设置用户凭据上的scope
    3. 通过将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');
        });
    });
    

    【讨论】:

    • 你在哪里得到 validateFunc 回调的返回,我的意思是在处理程序中还是在哪里?如果是由 Rest-Hapi 模块创建的隐式 API,我想要 validateFunc 的结果。或者详细请检查:- stackoverflow.com/questions/44546596/…
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2023-01-24
    • 2021-11-22
    • 2019-10-10
    • 2017-08-03
    相关资源
    最近更新 更多