在现代 Web 应用中,权限管理是一个重要的主题。随着应用规模的增长和功能逐渐复杂化,管理和控制用户权限变得越来越困难。 某些漏洞和错误在这方面是不可避免的,从而导致安全漏洞和数据泄露。为了避免此类问题,我们可以利用 Role-based Access Control (RBAC) 的方式来实现权限管理。
什么是 Role-based Access Control?
Role-based Access Control(基于角色访问控制)是一种常见的访问授权模型,可以为应用程序中的不同角色分配不同的权限。这些角色可以是用户组、工作职能或组织层次结构中的一个或多个。
资源
在 RBAC 模型中,资源是指应用程序中需要保护的任何对象,比如数据记录或者整个功能模块。资源可以被分配给某一个或多个角色。
角色
角色是指与应用程序相关的任何固定或流动的工作职能或组织层次结构中的一个或多个级别。每个角色可以被授予一组权限,不同角色之间的权限不一定相同。
权限
权限是规定访问资源所需的操作或动作。在 RBAC 中,权限被赋予给不同的角色,用户被授予相应的角色。
用户
用户是 RBAC 模型中的最终受益者。用户被授予一个或多个角色,每个角色包含一组权限。用户通过角色来访问资源。
Hapi.js 实现 Role-based Access Control
Hapi.js 是现代 Node.js Web 应用程序框架。它提供了强大的路由和处理请求的功能,同时支持插件化的开发方式。 Hapi.js 也提供了一些强大的工具来帮助开发者实现访问控制。 在本文中,我们将使用 Hapi.js 框架和 hapi-authz 插件来实现 RBAC。
安装 hapi-authz
我们需要先安装 hapi-authz 插件。可以通过以下命令进行安装:
npm install hapi-authz
创建角色
在 Hapi.js 中创建角色很简单。只需要定义角色及其权限列表。在下面的示例代码中,我们创建了一个包含管理员和普通用户两个角色,每个角色具有不同的权限。
let roles = { admin: { permissions: ['create', 'read', 'update', 'delete'] }, user: { permissions: ['read'] } };
配置授权策略
接下来,我们需要为我们的应用配置授权策略。请注意,我们将使用 role_{roleName}
命名格式来标识每个角色的授权策略。
// javascriptcn.com 代码示例 const hapiAuthz = require('hapi-authz'); const validateUser = async (decoded, request, h) => { // 实现用户验证,返回一个用户对象 }; server.register({ plugin: hapiAuthz, options: { roles: roles, unauthorized: function (request, h, err) { throw err; } } });
实现路由和处理程序
最后,我们需要实现路由和处理程序。在示例代码中,我们创建两个路由用于演示授权,一个为管理员,另一个为普通用户。 在路由定义中,我们可以使用 access
选项来指定访问授权策略。如果不指定,则默认为 access: 'auth'
,即请求只能被验证用户访问。
// javascriptcn.com 代码示例 const routes = [ { method: 'GET', path: '/admin', handler: async (request, h) => { return h.response("Welcome Admin"); }, config: { auth: 'jwt', access: { scope: ['admin'] } } }, { method: 'GET', path: '/user', handler: async (request, h) => { return h.response("Welcome User"); }, config: { auth: 'jwt', access: { scope: ['user'] } } } ]; server.route(routes);
总结
Hapi.js 框架和 hapi-authz 插件是实现 RBAC 的优秀选择。通过这种方式,我们可以轻松地为应用程序创建角色,为每个角色分配不同的权限,并在路由中指定访问授权策略。 在代码实现中,我们应确保实现用户验证和错误处理机制以增强应用安全性。
参考文献
- Role-based access control - Wikipedia
- Hapijs - Build Smart, Scalable and Secure Node.js® Web Applications
- hapi-authz - Plugin for Hapi.js that provides role-based access control
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653323987d4982a6eb6866e0