使用 Node.js 和 Express 实现基于角色的权限控制

在现代 Web 应用程序中,用户身份验证和权限控制是必不可少的功能。基于角色的权限控制(RBAC)是一种常见的方法,它允许定义不同角色的操作权限。这种方法非常适用于中小型 Web 应用程序,因为它易于实现和维护。

在本篇文章中,我们将介绍如何使用 Node.js 和 Express 框架来实现基于角色的权限控制。我们将通过一个示例应用程序来演示如何定义角色和操作权限,并在应用程序中验证和控制这些权限。

示例应用程序需求

在我们的示例应用程序中,我们将建立一个在线商店。应用程序有以下几个需求:

  • 有两种用户类型:管理员和普通用户;
  • 管理员可以添加、编辑和删除商店中的产品;
  • 普通用户可以查看商店中的所有产品。

在这个示例中,我们将为两种用户类型定义角色,以便可以限制它们的行为。

实现基于角色的权限控制

要使用 Node.js 和 Express 实现基于角色的权限控制,我们可以使用中间件(Middleware)和路由(Routes)。我们可以使用中间件来验证用户的身份和权限,然后使用路由来处理请求。

角色定义

首先,我们需要定义两个角色:管理员和普通用户。在我们的示例应用程序中,管理员具有添加、编辑和删除产品的权限,而普通用户只能查看产品。

我们可以使用一个 JavaScript 对象来表示这些角色和它们的操作:

----- ----- - -
  ------ -
    ----------- -----
    ------------ -----
    -------------- -----
    ------------ -----
  --
  ----- -
    ----------- ------
    ------------ ------
    -------------- ------
    ------------ -----
  --
--

用户身份验证

在权限控制之前,我们需要验证用户的身份。我们可以使用 Passport.js 中间件来实现身份验证。这里我们采用本地策略(Local Strategy),我们使用用户名和密码进行身份验证。

----- -------- - --------------------
----- ------------- - -----------------------------------

-------------
  --- ------------------------ --------- ----- -- -
    -- ----
    -------------- --------- -------- -- ----- ----- -- -
      -- ----- ------ ----------
      -- ------- ------ ---------- -------
      -- ----
      ----------------------------- ----- -------- -- -
        -- ----- ------ ----------
        -- ---------- ------ ---------- -------
        ------ ---------- ------
      ---
    ---
  --
--

权限验证

我们现在已经验证了用户的身份。接下来,我们需要检查用户是否具有相应的操作权限。我们将使用一个名为checkPermission的中间件来实现这一点。

----- --------------- - ----------- -- -
  ------ ----- ---- ----- -- -
    -- ---------
    -- ------------------------ -
      ------ -------------------------------------
    -
    -- -------------
    ----- -------- - --------------
    ----- ---------- - ---------------------------
    -- ------------- -
      ------ ----------------------------------
    -
    -------
  --
--

中间件接受一个操作参数(如addProduct),并返回一个路由处理程序。该处理程序会检查用户是否已验证,并且是否具有所需的权限。如果未符合要求,则返回适当的 HTTP 状态代码(401:未授权,403:禁止访问)。

路由定义

我们现在已经定义了角色和身份验证和权限中间件。接下来,我们可以定义路由来处理请求。对于管理员用户,我们可以定义以下路由:

-- ----
---------
  -----------------
  ------------------------------
  ----- ---- -- -
    -- --------
    ----------------------------- --------
  -
--

-- ----
--------
  ---------------------
  -------------------------------
  ----- ---- -- -
    -- --------
    ----------------------------- ---------
  -
--

-- ----
-----------
  ---------------------
  ---------------------------------
  ----- ---- -- -
    -- --------
    ----------------------------- ----------
  -
--

对于普通用户,我们可以定义以下路由:

-- ------
-------------------- ------------------------------- ----- ---- -- -
  -- ------
  ----------------------------- -------
---

这些路由将使用checkPermission中间件来检查用户的权限。如果用户具有所需的权限,则路由处理程序将被调用。

完整的示例代码

下面是一个完整的示例代码,其中包括身份验证、权限中间件和路由的定义。

----- ------- - -------------------
----- ---------- - -----------------------
----- -------- - --------------------
----- ------------- - -----------------------------------

----- --- - ----------
---------------------------
------------------------------- --------- ---- ----
-------------------------------

-- ----
----- ----- - -
  ------ -
    ----------- -----
    ------------ -----
    -------------- -----
    ------------ -----
  --
  ----- -
    ----------- ------
    ------------ ------
    -------------- ------
    ------------ -----
  --
--

-- ----
----- ----- - -
  -
    --- --
    --------- --------
    --------- ---------
    ----- --------
  --
  -
    --- --
    --------- -------
    --------- ---------
    ----- -------
  --
--

-- ----
----- ------------------ - ---------- -- -
  ------ ----------------- -- ------------- --- ----------
--

-- ----
----- -------------- - ---------- ----- -- -
  ------ -------- --- ----- -- --------------
--

-- ----
-------------
  --- ------------------------ --------- ----- -- -
    ----- ---- - -----------------------------
    -- ------- ------ ---------- -------
    ----- ------- - ------------------------ ---------------
    -- ---------- ------ ---------- -------
    ---------- ------
  --
--

-- ----
----- --------------- - ----------- -- -
  ------ ----- ---- ----- -- -
    -- ------------------------ -
      ------ -------------------------------------
    -
    ----- -------- - --------------
    ----- ---------- - ---------------------------
    -- ------------- -
      ------ ----------------------------------
    -
    -------
  --
--

---------
  -----------------
  ------------------------------
  ----- ---- -- -
    -- --------
    ----------------------------- --------
  -
--

--------
  ---------------------
  -------------------------------
  ----- ---- -- -
    -- --------
    ----------------------------- ---------
  -
--

-----------
  ---------------------
  ---------------------------------
  ----- ---- -- -
    -- --------
    ----------------------------- ----------
  -
--

-------------------- ------------------------------- ----- ---- -- -
  -- ------
  ----------------------------- -------
---

---------------- -- -- -
  ------------------- ----------
---

结论

基于角色的权限控制是实现现代 Web 应用程序中必不可少的一部分。使用 Node.js 和 Express 框架时,可以使用中间件和路由来实现权限控制。本文演示了如何在示例应用程序中使用角色定义、身份验证和权限控制来实现基于角色的权限控制。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671d8e4d9babaf620fb6e6a6