在现代 Web 应用程序中,用户身份验证和权限控制是必不可少的功能。基于角色的权限控制(RBAC)是一种常见的方法,它允许定义不同角色的操作权限。这种方法非常适用于中小型 Web 应用程序,因为它易于实现和维护。
在本篇文章中,我们将介绍如何使用 Node.js 和 Express 框架来实现基于角色的权限控制。我们将通过一个示例应用程序来演示如何定义角色和操作权限,并在应用程序中验证和控制这些权限。
示例应用程序需求
在我们的示例应用程序中,我们将建立一个在线商店。应用程序有以下几个需求:
- 有两种用户类型:管理员和普通用户;
- 管理员可以添加、编辑和删除商店中的产品;
- 普通用户可以查看商店中的所有产品。
在这个示例中,我们将为两种用户类型定义角色,以便可以限制它们的行为。
实现基于角色的权限控制
要使用 Node.js 和 Express 实现基于角色的权限控制,我们可以使用中间件(Middleware)和路由(Routes)。我们可以使用中间件来验证用户的身份和权限,然后使用路由来处理请求。
角色定义
首先,我们需要定义两个角色:管理员和普通用户。在我们的示例应用程序中,管理员具有添加、编辑和删除产品的权限,而普通用户只能查看产品。
我们可以使用一个 JavaScript 对象来表示这些角色和它们的操作:
-- -------------------- ---- ------- ----- ----- - - ------ - ----------- ----- ------------ ----- -------------- ----- ------------ ----- -- ----- - ----------- ------ ------------ ------ -------------- ------ ------------ ----- -- --
用户身份验证
在权限控制之前,我们需要验证用户的身份。我们可以使用 Passport.js 中间件来实现身份验证。这里我们采用本地策略(Local Strategy),我们使用用户名和密码进行身份验证。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ------------- --- ------------------------ --------- ----- -- - -- ---- -------------- --------- -------- -- ----- ----- -- - -- ----- ------ ---------- -- ------- ------ ---------- ------- -- ---- ----------------------------- ----- -------- -- - -- ----- ------ ---------- -- ---------- ------ ---------- ------- ------ ---------- ------ --- --- -- --
权限验证
我们现在已经验证了用户的身份。接下来,我们需要检查用户是否具有相应的操作权限。我们将使用一个名为checkPermission
的中间件来实现这一点。
-- -------------------- ---- ------- ----- --------------- - ----------- -- - ------ ----- ---- ----- -- - -- --------- -- ------------------------ - ------ ------------------------------------- - -- ------------- ----- -------- - -------------- ----- ---------- - --------------------------- -- ------------- - ------ ---------------------------------- - ------- -- --
中间件接受一个操作参数(如addProduct
),并返回一个路由处理程序。该处理程序会检查用户是否已验证,并且是否具有所需的权限。如果未符合要求,则返回适当的 HTTP 状态代码(401:未授权,403:禁止访问)。
路由定义
我们现在已经定义了角色和身份验证和权限中间件。接下来,我们可以定义路由来处理请求。对于管理员用户,我们可以定义以下路由:
-- -------------------- ---- ------- -- ---- --------- ----------------- ------------------------------ ----- ---- -- - -- -------- ----------------------------- -------- - -- -- ---- -------- --------------------- ------------------------------- ----- ---- -- - -- -------- ----------------------------- --------- - -- -- ---- ----------- --------------------- --------------------------------- ----- ---- -- - -- -------- ----------------------------- ---------- - --
对于普通用户,我们可以定义以下路由:
// 查看所有产品 app.get('/products', checkPermission('viewProduct'), (req, res) => { // 返回所有产品 res.status(200).send('Product list'); });
这些路由将使用checkPermission
中间件来检查用户的权限。如果用户具有所需的权限,则路由处理程序将被调用。
完整的示例代码
下面是一个完整的示例代码,其中包括身份验证、权限中间件和路由的定义。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- --- - ---------- --------------------------- ------------------------------- --------- ---- ---- ------------------------------- -- ---- ----- ----- - - ------ - ----------- ----- ------------ ----- -------------- ----- ------------ ----- -- ----- - ----------- ------ ------------ ------ -------------- ------ ------------ ----- -- -- -- ---- ----- ----- - - - --- -- --------- -------- --------- --------- ----- -------- -- - --- -- --------- ------- --------- --------- ----- ------- -- -- -- ---- ----- ------------------ - ---------- -- - ------ ----------------- -- ------------- --- ---------- -- -- ---- ----- -------------- - ---------- ----- -- - ------ -------- --- ----- -- -------------- -- -- ---- ------------- --- ------------------------ --------- ----- -- - ----- ---- - ----------------------------- -- ------- ------ ---------- ------- ----- ------- - ------------------------ --------------- -- ---------- ------ ---------- ------- ---------- ------ -- -- -- ---- ----- --------------- - ----------- -- - ------ ----- ---- ----- -- - -- ------------------------ - ------ ------------------------------------- - ----- -------- - -------------- ----- ---------- - --------------------------- -- ------------- - ------ ---------------------------------- - ------- -- -- --------- ----------------- ------------------------------ ----- ---- -- - -- -------- ----------------------------- -------- - -- -------- --------------------- ------------------------------- ----- ---- -- - -- -------- ----------------------------- --------- - -- ----------- --------------------- --------------------------------- ----- ---- -- - -- -------- ----------------------------- ---------- - -- -------------------- ------------------------------- ----- ---- -- - -- ------ ----------------------------- ------- --- ---------------- -- -- - ------------------- ---------- ---
结论
基于角色的权限控制是实现现代 Web 应用程序中必不可少的一部分。使用 Node.js 和 Express 框架时,可以使用中间件和路由来实现权限控制。本文演示了如何在示例应用程序中使用角色定义、身份验证和权限控制来实现基于角色的权限控制。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671d8e4d9babaf620fb6e6a6