」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 將 CASL 與 React 整合以實現強大的授權

將 CASL 與 React 整合以實現強大的授權

發佈於2024-09-15
瀏覽:128

Integrating CASL with React for Robust Authorization

介紹

授權是任何 Web 應用程式的關鍵方面,確保使用者只能存取允許他們互動的功能和資料。 CASL(代表「基於能力的存取控制」)是一個流行的 JavaScript 程式庫,用於以靈活的聲明性方式處理此邏輯。在本文中,我們將介紹如何將 CASL 與 React 應用程式集成,為您提供實現有效授權的工具。

先決條件

在深入整合之前,您應該熟悉以下內容:

  • React 的基本了解。
  • 熟悉 React 中的狀態管理。
  • JavaScript ES6基礎知識.

第 1 步:設定 CASL

npm install @casl/ability @casl/react

第 2 步:定義能力

能力定義使用者可以對特定資源執行哪些操作。讓我們從建立一個能力實例開始。

import { Ability } from '@casl/ability';

const defineAbilitiesFor = (user) => {
  return new Ability([
    {
      action: 'read',
      subject: 'Article',
    },
    {
      action: 'update',
      subject: 'Article',
      conditions: { authorId: user.id },
    },
  ]);
};

export default defineAbilitiesFor;

在這個例子中,我們定義了兩種能力:

  • 所有使用者都可以閱讀文章。
  • 使用者只能更新自己撰寫的文章。

第 3 步:將 CASL 與 React 集成

要在 React 元件中使用這些功能,您可以建立一個上下文來在整個應用程式中提供功能實例。

import React, { createContext, useContext } from 'react';
import { Ability } from '@casl/ability';

const AbilityContext = createContext();

export const AbilityProvider = ({ children, user }) => {
  const ability = defineAbilitiesFor(user);

  return (
    
      {children}
    
  );
};

export const useAbility = () => useContext(AbilityContext);

第 4 步:保護組件

現在您已經設定了上下文,您可以使用 @casl/react 提供的 Can 元件來保護您的元件。

import { Can } from '@casl/react';

function Article({ article }) {
  const ability = useAbility();

  return (
    

{article.title}

{article.content}

); }

這裡,「編輯文章」按鈕只有在使用者有更新文章的權限時才可見。

步驟5:處理未經授權的訪問

CASL 還可以協助管理使用者嘗試未經授權的操作時發生的情況。這可以透過檢查事件處理程序或 API 呼叫中的能力來完成。

const handleEdit = () => {
  if (!ability.can('update', article)) {
    alert('You are not allowed to edit this article!');
    return;
  }

  // proceed with editing logic
};

結論

將 CASL 與 React 整合提供了一種乾淨且聲明式的方式來管理應用程式中的授權。透過定義功能並使用 Can 元件,您可以輕鬆控制使用者可以看到和執行的操作,從而提高應用程式的安全性和使用者體驗。

版本聲明 本文轉載於:https://dev.to/marwenshili/integrating-casl-with-react-for-robust-authorization-5ci?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 掌握 TypeScript:了解擴充的力量
    掌握 TypeScript:了解擴充的力量
    TypeScript 中的 extends 关键字就像一把瑞士军刀。它用于多种上下文,包括继承、泛型和条件类型。了解如何有效地使用扩展可以生成更健壮、可重用和类型安全的代码。 使用扩展进行继承 extends 的主要用途之一是继承,允许您创建基于现有接口或类的新接口或类。 inter...
    程式設計 發佈於2024-11-06
  • 如何將具有群組計數的欄位新增至 Pandas 中的分組資料框?
    如何將具有群組計數的欄位新增至 Pandas 中的分組資料框?
    如何在Pandas中向分組資料框中添加列在資料分析中,經常需要將資料分組並進行計算每組。 Pandas 透過其 groupby 函數提供了一種便捷的方法來做到這一點。一個常見的任務是計算每個組中某一列的值,並將包含這些計數的列加入到資料幀中。 考慮資料幀df:df = pd.DataFrame({'...
    程式設計 發佈於2024-11-06
  • 破解編碼面試的熱門必備書籍(從初級到高級排名)
    破解編碼面試的熱門必備書籍(從初級到高級排名)
    准备编码面试可能是一个充满挑战的旅程,但拥有正确的资源可以让一切变得不同。无论您是从算法开始的初学者、专注于系统设计的中级开发人员,还是完善编码实践的高级工程师,这份按难度排名的前 10 本书列表都将为您提供成功所需的知识和技能。你的软件工程面试。这些书籍涵盖了从基本算法到系统设计和简洁编码原则的所...
    程式設計 發佈於2024-11-06
  • Java 字串實習初學者指南
    Java 字串實習初學者指南
    Java String Interning 引入了透過在共享池中儲存唯一字串來優化記憶體的概念,減少重複物件。它解釋了 Java 如何自動實習字串文字以及開發人員如何使用 intern() 方法手動將字串新增至池中。 透過掌握字串駐留,您可以提高 Java 應用程式的效能和記憶體效率。要深入了解...
    程式設計 發佈於2024-11-06
  • 如何在 GUI 應用程式中的不同頁面之間共用變數資料?
    如何在 GUI 應用程式中的不同頁面之間共用變數資料?
    如何從類別中取得變數資料在 GUI 程式設計環境中,單一應用程式視窗中包含多個頁面是很常見的。每個頁面可能包含各種小部件,例如輸入欄位、按鈕或標籤。當與這些小部件互動時,使用者提供輸入或做出需要在不同頁面之間共享的選擇。這就提出瞭如何從一個類別存取另一個類別的變數資料的問題,特別是當這些類別代表不同...
    程式設計 發佈於2024-11-06
  • React 中的動態路由
    React 中的動態路由
    React 中的動態路由可讓您基於動態資料或參數建立路由,從而在應用程式中實現更靈活、更強大的導航。這對於需要根據使用者輸入或其他動態因素呈現不同元件的應用程式特別有用。 使用 React Router 設定動態路由 您通常會使用react-router-dom程式庫在React中實作動態路由。這...
    程式設計 發佈於2024-11-06
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-06
  • WPF中延遲操作時如何避免UI凍結?
    WPF中延遲操作時如何避免UI凍結?
    WPF 中的延遲操作WPF 中的延遲操作對於增強用戶體驗和確保平滑過渡至關重要。常見的情況是在導航到新視窗之前添加延遲。 為了實現此目的,經常使用 Thread.Sleep,如提供的程式碼片段所示。但是,在延遲過程中,使用 Thread.Sleep 阻塞 UI 執行緒會導致 UI 無回應。這表現為在...
    程式設計 發佈於2024-11-06
  • 利用 Java 進行即時資料流和處理
    利用 Java 進行即時資料流和處理
    In today's data-driven world, the ability to process and analyze data in real-time is crucial for businesses to make informed decisions swiftly. Java...
    程式設計 發佈於2024-11-06
  • 如何修復損壞的 InnoDB 表?
    如何修復損壞的 InnoDB 表?
    從 InnoDB 表損壞中恢復災難性事件可能會導致資料庫表嚴重損壞,特別是 InnoDB 表。遇到這種情況時,了解可用的修復選項就變得至關重要。 InnoDB Table Corruption Symptoms查詢中所述的症狀,包括交易日誌中的時間戳錯誤InnoDB 表的修復策略雖然已經有修復MyI...
    程式設計 發佈於2024-11-06
  • JavaScript 陣列和物件中是否正式允許使用尾隨逗號?
    JavaScript 陣列和物件中是否正式允許使用尾隨逗號?
    陣列與物件中的尾隨逗號:標準還是容忍? 數組和物件中尾隨逗號的存在引發了一些關於它們的爭論JavaScript 的標準化。這個問題源自於在不同瀏覽器中觀察到的不一致行為,特別是舊版的 Internet Explorer。 規範狀態規範狀態ObjectLiteral : { } { P...
    程式設計 發佈於2024-11-06
  • 最佳引導模板產生器
    最佳引導模板產生器
    在當今快速發展的數位環境中,速度和效率是關鍵,網頁設計師和開發人員越來越依賴 Bootstrap 建構器來簡化他們的工作流程。這些工具可以快速創建響應靈敏、具有視覺吸引力的網站,使團隊能夠比以往更快地將他們的想法變為現實。 Bootstrap 建構器真正改變了網站的建構方式,使過程更加易於存取和高...
    程式設計 發佈於2024-11-06
  • 簡化 NestJS 中的檔案上傳:無需磁碟儲存即可高效能記憶體中解析 CSV 和 XLSX
    簡化 NestJS 中的檔案上傳:無需磁碟儲存即可高效能記憶體中解析 CSV 和 XLSX
    Effortless File Parsing in NestJS: Manage CSV and XLSX Uploads in Memory for Speed, Security, and Scalability Introduction Handling file uploa...
    程式設計 發佈於2024-11-06
  • 使用 SubDomainRadar.io 和 Python 輕鬆發現隱藏子網域
    使用 SubDomainRadar.io 和 Python 輕鬆發現隱藏子網域
    作為網路安全專業人員、漏洞賞金獵人或滲透測試人員,發現隱藏的子域對於識別至關重要域中的潛在漏洞。子網域通常託管可能容易受到攻擊的被遺忘的服務或測試環境。 在這篇文章中,我將向您介紹SubDomainRadar.io 及其Python API 包裝器 — 自動化子域枚舉的終極工具和安全工作流程中的反...
    程式設計 發佈於2024-11-06
  • Python 中的 HackerRank 問題 - 基本資料類型列表
    Python 中的 HackerRank 問題 - 基本資料類型列表
    此 Python 程式碼旨在根據使用者提供的命令對清單執行一系列操作。讓我們一步步分析程式碼,了解其工作原理: if __name__ == '__main__': N = int(input()) l = [] while(N>0): cmd_l = ...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3