如何在 Redux 中作者身份验证中实现反面控制

在 Redux 应用程序中,常常需要实现身份验证功能来确保操作安全。其中一种常见的做法是在操作流程中添加授权检查环节。然而,当涉及到身份验证的场景变得更加复杂时,我们可能需要灵活地控制授权检查的流程,以便实现更加细粒度的权限控制。本文将介绍如何在 Redux 中,通过实现反面控制方式,来实现这种需求。

反面控制的概念

在传统的授权检查流程中,权限控制通常采用正面控制方式,即只要符合授权规则,就执行相应的操作。而反面控制则相反,它是指只有当符合授权规则时,拒绝执行操作。如果把授权规则看成一个黑名单,那么正面控制相当于从黑名单中挑选授权的项目,而反面控制则是从黑名单中排除不授权的项目。实际上,反面控制和正面控制本质上是等价的,只是表达方式不同而已。

在 Redux 应用中实现反面控制身份验证

对于 Redux 应用来说,本质上它只是一个状态管理容器。为了实现反面控制身份验证,我们需要通过定义授权规则以及定义反面控制逻辑来调整这个状态容器。下面我们将逐步介绍如何实现。

步骤 1:定义授权规则

作为反面控制的前提,我们首先需要定义授权规则。在 Redux 中实现授权规则的方式非常多样化,例如:

  • 可以将权限信息嵌入到 action 内部,例如将权限信息作为一个字段存放在 action 对象内,如下所示:

    ----- ------ - -
      ----- -------------
      -------- ------
      ----------- ----------------
    -
  • 可以在 Reducer 中根据 action 的类型以及其他条件来动态计算权限信息。这个过程可以使用 Redux 的 middleware 来进行拦截。在这里,我们不对这种情况进行深入讨论。

在本文中,我们将采用第一种方式来实现身份验证。

步骤 2:在应用中添加身份认证 Middleware

为了在 Redux 应用中实现身份认证的反面控制逻辑,我们需要在应用中添加身份认证 Middleware,用于拦截所有的 action,并判断该操作是否受到了授权。这时,我们需要一个具备以下功能的 Middleware:

  1. 监听所有 action 的触发。
  2. 对于禁止执行的 action(即不满足授权规则)进行阻止。
  3. 对于允许执行的 action(即满足授权规则)进行放行。
  4. 将所有已授权的操作转发给下一个 Middleware。

可以通过以下代码实现该 Middleware:

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

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

步骤 3:添加身份认证 Reducer

在 Redux 应用中,我们需要保存身份认证的状态,因此需要定义一个 Reducer 来处理身份认证相关的 action。在本文中,我们假设这个 Reducer 的名称为 authentication,并定义 isAutheintcated 字段表示身份认证是否通过。修改过程如下:

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

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

步骤 4:组合 Middleware 和 Reducer

最后,我们需要将 authMiddleware 和 authentication Reducer 组合到 Redux 应用中。可以使用 combineReducers 函数将多个 Reducer 合并成一个根状态树,并在 createStore 函数中使用 applyMiddleware 函数添加 Middleware:

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

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

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

示例代码

下面是一个简单的 Redux 应用,其中我们添加了反面控制身份验证的实现:

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

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

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

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

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

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

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

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

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

总结

通过反面控制身份验证,在 Redux 应用中实现更加细粒度的授权管理是一种非常好的实践方式。通过沉淀出具备通用性的身份验证 Middleware,我们可以在应用程序的任何业务场景中复用它,并获得更好的代码复用性和可维护性。希望本文介绍的方式能够对你在实践中解决身份验证问题提供一些启示。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6485e53b48841e989449a185


猜你喜欢

  • PWA Push 及 Notification 优化实践

    在现代化 Web 应用开发中,PWA 技术已经成为了非常重要的一项技术和实践。其中,push 及 notification 功能的应用和实现,更是极具指导意义和深度。

    1 年前
  • Custom Elements和Redux的混合开发教程

    Custom Elements和Redux是两个非常强大的前端开发工具。其中Custom Elements允许您创建您自己的自定义HTML元素,并在您的应用程序中重复使用它们。

    1 年前
  • 使用 Mocha 测试时如何 Mock 掉定时器?

    在前端开发中,我们通常会使用 Mocha 这个测试框架进行单元测试。在测试过程中,经常需要模拟或 mock 掉某些外部的依赖,比如定时器。而如何 mock 掉定时器,是一个经常困扰前端工程师的问题。

    1 年前
  • Node.js 性能优化:使用内存池技术

    在 Node.js 的 Web 应用程序中,性能是非常重要的一项关注点。一个高性能的 Node.js 应用程序可以提高用户体验,减少服务器负载,以及降低运营成本。在 Node.js 性能优化的过程中,...

    1 年前
  • Node.js 中的 Web 框架选型与比较

    随着 Node.js 的流行,越来越多的 Web 框架出现在了我们的视野中。选择一个适合自己的 Web 框架是 Web 开发的第一步,本文将对 Node.js 的 Web 框架进行介绍和比较,并提供相...

    1 年前
  • 如何在使用 CSS Reset 的情况下避免字体大小变化?

    在前端开发中,我们通常会使用 CSS reset 来消除不同浏览器之间的样式差异,以确保网站的稳定和一致性。然而,有时候我们在使用 CSS reset 的过程中会发现字体大小变化了,给用户带来了不良的...

    1 年前
  • TypeScript 中定义类的属性和方法的详解

    在 TypeScript 中,类是定义对象的蓝图,它是构造面向对象程序的基础。在本文中,我们将详细讨论如何在 TypeScript 中定义类的属性和方法。 定义类的属性 类的属性是类所拥有的变量。

    1 年前
  • ES9中的Promise.allSettled()方法详解

    ES9中的Promise.allSettled()方法详解 在ES9中,Promise新增了一个非常实用的方法——Promise.allSettled()。这个方法可以在一个数组中同时运行多个Prom...

    1 年前
  • 使用 ESLint 检查代码缩进

    前言 在编写前端代码时,代码缩进是很重要的一点。它不仅能让代码易读,更能让代码的结构更加清晰。然而,很多开发者可能不太在意代码缩进,或者缩进风格不一致,导致代码可读性差。

    1 年前
  • 解决 Redux 中异步请求的一些常见问题

    在前端应用中,异步请求是一项非常重要的技术。Redux 作为状态管理工具,也需要处理异步请求。本文将介绍 Redux 中异步请求的一些常见问题,并提供解决方案和示例代码。

    1 年前
  • # Promise 和回调函数的执行顺序问题

    Promise 和回调函数的执行顺序问题 在前端开发中,我们常常需要处理异步任务,而 Promise 和回调函数则是最常见的两种处理方式。但是,当我们同时使用 Promise 和回调函数时,可能会遇到...

    1 年前
  • webpack4 打造前端自动化构建工程化

    在前端开发中,随着项目越来越复杂,前端自动化构建就成为了必备的技能。而 webpack 作为前端自动化构建工具的主要候选,可谓是越来越受到开发者的关注。本文就来详细介绍 webpack4 的使用方式,...

    1 年前
  • ECMAScript 2021 中的 WeakRefs:解决内存泄漏问题

    在前端开发过程中,内存泄漏一直是一个令开发者头痛的问题。随着 JavaScript 语言的发展,WeakRefs(弱引用)被引入到 ECMAScript 2021 标准中,为开发者解决了一些内存泄漏问...

    1 年前
  • ES11 中的 export * as 别名

    在前端开发中,模块化已经成为了必不可少的一环。ES6 提供了一种新的语法 export/import,可以让我们更方便地管理模块之间的依赖关系。而在 ES11 中,新加入了一种 export * as...

    1 年前
  • 从 Express.js 到 Nest.js: 使用 Node.js 构建现代 Web 应用程序

    Node.js 是一个非常受欢迎的开源软件平台,用于构建高性能的 Web 应用程序。Node.js 有很多流行的 Web 框架,其中 Express.js 是目前最受欢迎的框架之一。

    1 年前
  • ES6 中的 Map 和 WeakMap 更优秀的数据结构

    在 JavaScript 中,对象是最基本的数据结构之一。然而在某些情况下,我们需要一种更灵活、更高效的数据结构来存储和操作数据。ES6 中的 Map 和 WeakMap 就是这样的一个数据结构。

    1 年前
  • Sequelize 指南:使用事务

    在开发现代 Web 应用程序时,数据库是不可或缺的一部分。因为数据库操作需要遵循ACID,即原子性、一致性、隔离性和持久性,事务的概念就显得非常重要。Sequelize 是一个 Node.js 中的O...

    1 年前
  • iOS 12 更新功能:无障碍环境

    概述 随着智能手机技术的不断发展,人们使用手机的时间也越来越长。特别是对于身体有残疾的人来说,手机是一个非常有用的工具,它能让他们更方便地进行交流、工作和娱乐。但是对于一些视觉或听觉上有困难的人来说,...

    1 年前
  • Serverless 如何使用 CDN 提升访问速度?

    随着 Web 应用的越来越普及,前端开发人员也需要不断地探寻新的技术,来提高 Web 应用的用户体验。其中,使用 CDN 进行加速是提高 Web 应用的访问速度和性能的一种有效方法。

    1 年前
  • 在 Jest 中实现测试用例的 skip 和 only 的方法

    Jest 是一个流行的 JavaScript 测试框架,用于编写测试用例和测试 JavaScript 应用程序。在使用 Jest 进行测试时,有时需要跳过某些测试用例,有时也需要仅运行某些特定的测试用...

    1 年前

相关推荐

    暂无文章