前言
在开发 Web 应用时,我们常常需要处理用户授权相关的问题,例如如何确保用户在访问受保护的页面时已经登录,或者如何限制某些页面只能被某些用户角色访问等。这种场景下,一个好用的授权库是非常重要的。在 Node.js 中,npm 包 authorizrr 就是一个非常不错的选择。
安装
使用 npm 安装 authorizrr:
npm install authorizrr --save
使用
要使用 authorizrr,我们需要先创建一个 Authorizer
对象,并通过 addRule
方法来添加授权规则。
以下是一个简单的例子:
-- -------------------- ---- ------- ----- - ---------- - - ---------------------- ----- ---------- - --- ------------- ---------------------------------- -- ---- -- -- - ------ ---- -- --------- --- -------- --- ----- -------------- - ------------------------ ----------------- ---------------- ----- -------------- --- ----- ---- -- - -- ------------------------------ ----------------- -- ----- ------------- --
在上述例子中,我们首先创建了一个 Authorizer
对象并添加了一个规则 hasAdminRole
。hasAdminRole
这个规则的判断逻辑是:
- 检查用户是否已经登录了;
- 如果已经登录,则检查用户是否属于
admin
角色。
接下来,我们创建了一个 Express 中间件函数 authMiddleware
,并将其绑定到了 /admin
路由上。authMiddleware
会根据传入的规则名称(即 rule: 'hasAdminRole'
)来判断用户是否有权访问当前路径,如果没有则会重定向到登录页。
授权规则
在 authorizrr 中,我们通过调用 addRule
方法来添加授权规则。addRule
方法需要传入两个参数:
- 规则名称,用于在后续的中间件函数中识别要应用的规则;
- 规则判断函数,接收一个对象参数
ctx
,其中ctx.user
属性存放了当前登录的用户对象(如果用户未登录则为undefined
)。
规则判断函数需要返回一个布尔值,表示用户是否具有访问权限。
基础规则
authorizrr 自带了一些编写授权规则的辅助函数,可以方便地编写出一些常见的授权规则。以下是一些基础规则的示例:
isAuthenticated
判断用户是否已经登录:
authorizer.addRule('isAuthenticated', ({ user }) => { return Boolean(user); });
hasRole
判断用户是否拥有指定的角色:
authorizer.addRule('hasRole', ({ user }, roleName) => { return user && user.role === roleName; });
在上述例子中,我们添加了一个规则 hasRole
,并在其判断函数的第二个参数处传入了一个字符串参数 roleName
。这个参数会在后续的中间件函数调用时被自动填充。
复合规则
authorizrr 允许我们将多个规则组合起来,形成一个复合规则。以下是一些复合规则的示例:
and
该规则要求所有子规则都返回 true,才会返回 true。
authorizer.addRule('isAuthenticatedAndHasRole', ({ user }, roleName) => { return authorizer.and('isAuthenticated', 'hasRole', roleName)({ user }, roleName); });
or
该规则要求至少有一个子规则返回 true,就会返回 true。
authorizer.addRule('isAuthenticatedOrHasRole', ({ user }, roleName) => { return authorizer.or('isAuthenticated', 'hasRole', roleName)({ user }, roleName); });
中间件
authorizrr 提供了一个 middleware
函数,可以用于 Express 等应用中。这个函数会返回一个中间件函数,用于判断用户是否有权访问当前路径。middleware
函数需要传入一个可选的选项参数:
rule
:指定要应用的规则名称。
下面是一个例子:
const authMiddleware = authorizer.middleware(); app.get('/admin', authMiddleware({ rule: 'hasAdminRole' }), (req, res) => { // ... })
注意,在使用中间件函数的时候,我们需要将规则名称(即 rule
参数)指定为要应用的规则名称,而不是规则判断函数本身。
总结
在本文中,我们介绍了 npm 包 authorizrr 的使用方法,包括规则定义、复合规则、中间件函数等。通过使用 authorizrr,我们可以方便地在 Web 应用中实现各种复杂的授权规则。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055a1681e8991b448d7b94