」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 Next.js 中新增 RBAC 授權

如何在 Next.js 中新增 RBAC 授權

發佈於2024-11-04
瀏覽:792

How to Add RBAC Authorization in Next.js

基於角色的存取控制(RBAC) 是現代Web 應用程式中的重要功能,使管理員能夠根據使用者在系統中的角色來管理使用者權限。在 Next.js 應用程式中實現 RBAC 涉及幾個關鍵步驟:定義角色和權限、將其與身份驗證整合以及在應用程式中實施存取控制。本指南將引導您完成為 Next.js 應用程式新增 RBAC 授權的過程。


1. 理解RBAC

基於角色的存取控制(RBAC)是一種根據授權使用者的角色限制系統存取的方法。角色定義一組權限,並為使用者指派角色以授予他們關聯的權限。例如,在應用程式中,您可能擁有管理員、編輯者和檢視者等角色,每個角色都有不同的存取等級。

2. 設定您的 Next.js 專案

如果您還沒有,請先建立 Next.js 專案:

npx create-next-app@latest my-rbac-app
cd my-rbac-app

3. 新增認證

在實施RBAC之前,您需要一個驗證機制來識別使用者。 Next.js 沒有內建驗證,因此您可以使用 NextAuth.js 或 Firebase Authentication 等函式庫。以下是設定 NextAuth.js 的簡要概述:

  1. 安裝NextAuth.js:
   npm install next-auth
  1. 建立用於身分驗證的 API 路由:

在pages/api目錄中,建立一個名為[...nextauth].js:
的文件

   // pages/api/auth/[...nextauth].js
   import NextAuth from 'next-auth';
   import CredentialsProvider from 'next-auth/providers/credentials';

   export default NextAuth({
     providers: [
       CredentialsProvider({
         async authorize(credentials) {
           // Here you should fetch and verify user credentials from your database
           const user = { id: 1, name: 'John Doe', email: '[email protected]', role: 'admin' };
           if (user) {
             return user;
           } else {
             return null;
           }
         }
       })
     ],
     pages: {
       signIn: '/auth/signin',
     },
     callbacks: {
       async session({ session, token }) {
         session.user.role = token.role;
         return session;
       },
       async jwt({ token, user }) {
         if (user) {
           token.role = user.role;
         }
         return token;
       }
     }
   });
  1. 新增登入頁:

在pages/auth/signin.js建立一個簡單的登入頁面:

   // pages/auth/signin.js
   import { signIn } from 'next-auth/react';

   export default function SignIn() {
     return (
       

Sign In

); }

4. 定義角色和權限

定義應用程式中的角色和權限。您可以在中央設定檔中或直接在程式碼中執行此操作。這是定義角色和權限的簡單範例:

// lib/roles.js
export const ROLES = {
  ADMIN: 'admin',
  EDITOR: 'editor',
  VIEWER: 'viewer',
};

export const PERMISSIONS = {
  [ROLES.ADMIN]: ['view_dashboard', 'edit_content', 'delete_content'],
  [ROLES.EDITOR]: ['view_dashboard', 'edit_content'],
  [ROLES.VIEWER]: ['view_dashboard'],
};

5. 實施 RBAC

將 RBAC 邏輯整合到您的 Next.js 頁面和 API 路由中。以下是如何根據角色限制存取:

  1. 保護頁:

創建一個高階元件 (HOC) 來包裝受保護的頁面:

   // lib/withAuth.js
   import { useSession, signIn } from 'next-auth/react';
   import { ROLES } from './roles';

   export function withAuth(Component, allowedRoles) {
     return function ProtectedPage(props) {
       const { data: session, status } = useSession();

       if (status === 'loading') return 

Loading...

; if (!session || !allowedRoles.includes(session.user.role)) { signIn(); return null; } return ; }; }

在您的頁面中使用此 HOC:

   // pages/admin.js
   import { withAuth } from '../lib/withAuth';
   import { ROLES } from '../lib/roles';

   function AdminPage() {
     return 
Welcome, Admin!
; } export default withAuth(AdminPage, [ROLES.ADMIN]);
  1. 保護 API 路由:

您也可以透過檢查使用者角色來保護API路由:

   // pages/api/protected-route.js
   import { getSession } from 'next-auth/react';
   import { ROLES } from '../../lib/roles';

   export default async function handler(req, res) {
     const session = await getSession({ req });

     if (!session || !ROLES.ADMIN.includes(session.user.role)) {
       return res.status(403).json({ message: 'Forbidden' });
     }

     res.status(200).json({ message: 'Success' });
   }

6. 測試與完善

確保徹底測試 RBAC 實施,以驗證權限和角色是否正確實施。測試不同的角色以確認存取限制按預期工作。

結論

將基於角色的存取控制 (RBAC) 整合到 Next.js 應用程式中涉及設定身份驗證、定義角色和權限以及在整個應用程式中強制執行這些角色。透過遵循本指南中概述的步驟,您可以有效地管理使用者存取並確保您的 Next.js 應用程式既安全又用戶友好。
4G SIM卡車相機

版本聲明 本文轉載於:https://dev.to/saman_sardari_22e7e9081be/how-to-add-rbac-authorization-in-nextjs-3ll6?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    通过 Databricks 中的流程自动化降低成本 我的客户需要降低在 Databricks 上运行的流程的成本。 Databricks 负责的功能之一是从各种 SFTP 收集文件,解压缩它们并将它们放入数据湖中。 自动化数据工作流程是现代数据工程的重要组成部分。在本文中,我们将探...
    程式設計 發佈於2024-11-08
  • 為什麼我的 GoLang 網路伺服器無法提供大型 MP4 影片?
    為什麼我的 GoLang 網路伺服器無法提供大型 MP4 影片?
    GoLang HTTP Webserver Serving MP4 Video挑戰使用 GoLang 創建了一個提供 HTML/JS/CSS 和映像的 Web 伺服器。當伺服器嘗試提供 MP4 視訊檔案時,視訊載入失敗,僅顯示視訊控制。 調查檢查視訊檔案後,發現較小的視訊可以正常工作,而較大的視訊則...
    程式設計 發佈於2024-11-08
  • 如何在不使用 HTML 表單的情況下使用 PHP 重新導向網頁並傳送 POST 資料?
    如何在不使用 HTML 表單的情況下使用 PHP 重新導向網頁並傳送 POST 資料?
    使用PHP 重定向和發送POST 資料在這個問題中,我們遇到了一個獨特的挑戰:如何重定向網頁並透過POST 方法不依賴HTML 表單。期望的結果是使用 PHP 腳本將隱藏欄位提交到外部網關。通常,透過GET 傳送資料非常簡單,如下面的程式碼片段所示:header('Location: http://...
    程式設計 發佈於2024-11-08
  • 如何處理JSF表單提交過程中的授權失敗?
    如何處理JSF表單提交過程中的授權失敗?
    JSF 表單提交期間的授權失敗:綜合分析在JSF 應用程式中實現自訂授權機制時,了解頁面導航和表單提交之間的區別至關重要。雖然重定向可以無縫地進行頁面導航,但它們在表單提交期間可能會遇到問題。 問題原因此問題的根本原因在於 JSF 表單提交觸發非同步請求。當發送重定向作為對非同步請求的回應時,JSF...
    程式設計 發佈於2024-11-08
  • 如何有效管理多個 JavaScript 和 CSS 檔案以獲得最佳頁面效能?
    如何有效管理多個 JavaScript 和 CSS 檔案以獲得最佳頁面效能?
    管理多個JavaScript 和CSS 檔案:最佳實踐組織過多的JavaScript 和CSS 檔案可能會帶來挑戰,特別是在保持最佳頁面性能方面。下面列出了有效解決此問題的最佳實踐。 PHP Minify:簡化 HTTP 請求不要載入大量單獨的文件,而是考慮使用 PHP Minify。該工具將多個 ...
    程式設計 發佈於2024-11-08
  • 我的 Amazon SDE 面試經驗 – 5 月 4 日
    我的 Amazon SDE 面試經驗 – 5 月 4 日
    我的 Amazon SDE 面试经历 – 2024 年 5 月 2024 年 5 月,我有机会面试亚马逊的软件开发工程师 (SDE) 职位。这一切都始于一位招聘人员通过 LinkedIn 联系我。我很惊喜,因为它总是令人兴奋。 一切是如何开始的 招聘人员专业且清晰,...
    程式設計 發佈於2024-11-08
  • 如何在 cURL POST 請求中傳送多個影像?
    如何在 cURL POST 請求中傳送多個影像?
    在cURL POST 請求中使用陣列在嘗試使用cURL 傳送影像陣列時,使用者可能會遇到僅第一個影像的問題傳輸數組值。這個問題探討如何修正這個問題。 原始程式碼似乎在陣列結構上有一個小缺陷。要解決此問題,建議使用 http_build_query 來正確格式化陣列:$fields = array( ...
    程式設計 發佈於2024-11-08
  • 為什麼 $_POST 中的 Axios POST 資料不可存取?
    為什麼 $_POST 中的 Axios POST 資料不可存取?
    Axios Post 參數未由$_POST 讀取您正在使用Axios 將資料發佈到PHP 端點,並希望在$ 中存取它_POST 或$_REQUEST。但是,您目前無法檢測到它。 最初,您使用了預設的 axios.post 方法,但由於懷疑標頭問題而切換到提供的程式碼片段。儘管發生了這種變化,數據仍然...
    程式設計 發佈於2024-11-08
  • ## JPQL 中的建構函數表達式:使用還是不使用?
    ## JPQL 中的建構函數表達式:使用還是不使用?
    JPQL 中的建構子表達式:有益或有問題的實踐? JPQL 提供了使用建構函式表達式在 select 語句中建立新物件的能力。雖然此功能提供了某些優勢,但它引發了關於其在軟體開發實踐中是否適用的問題。 建構函數表達式的優點建構函數表達式允許開發人員從實體中提取特定資料並進行組裝,從而簡化了資料檢索將...
    程式設計 發佈於2024-11-08
  • 原型
    原型
    創意設計模式之一。 用於建立給定物件的重複/淺副本。 當直接建立物件成本高昂時,此模式很有用,例如:如果在查詢大型資料庫後建立對象,則一次又一次地建立該物件在效能方面並不經濟。 因此,一旦創建了對象,我們就緩存該對象,並且在將來需要相同的對象時,我們從緩存中獲取它,而不是從數據庫中再次創建它,...
    程式設計 發佈於2024-11-08
  • Python 變數:命名規則和型別推斷解釋
    Python 變數:命名規則和型別推斷解釋
    Python 是一種廣泛使用的程式語言,以其簡單性和可讀性而聞名。了解變數的工作原理是編寫高效 Python 程式碼的基礎。在本文中,我們將介紹Python變數命名規則和類型推斷,確保您可以編寫乾淨、無錯誤的程式碼。 Python變數命名規則 在Python中命名變數時,必須遵循一...
    程式設計 發佈於2024-11-08
  • 如何同時有效率地將多個欄位新增至 Pandas DataFrame ?
    如何同時有效率地將多個欄位新增至 Pandas DataFrame ?
    同時向Pandas DataFrame 添加多個列在Pandas 資料操作中,有效地向DataFrame 添加多個新列可能是一項需要優雅解決方案的任務。雖然使用帶有等號的列列表語法的直覺方法可能看起來很簡單,但它可能會導致意外的結果。 挑戰如提供的範例所示,以下語法無法如預期建立新欄位:df[['c...
    程式設計 發佈於2024-11-08
  • 從開發人員到資深架構師:技術專長與奉獻精神的成功故事
    從開發人員到資深架構師:技術專長與奉獻精神的成功故事
    一個開發人員晉升為高級架構師的真實故事 一位熟練的Java EE開發人員,只有4年的經驗,加入了一家跨國IT公司,並晉升為高級架構師。憑藉著多樣化的技能和 Oracle 認證的 Java EE 企業架構師,該開發人員已經證明了他在架構領域的勇氣。 加入公司後,開發人員被分配到一個項目,該公司在為汽...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 8.1 中有條件地將元素新增至關聯數組?
    如何在 PHP 8.1 中有條件地將元素新增至關聯數組?
    條件數組元素添加在 PHP 中,有條件地將元素添加到關聯數組的任務可能是一個挑戰。例如,考慮以下數組:$arr = ['a' => 'abc'];我們如何有條件地添加'b' => 'xyz'使用array() 語句對此陣列進行運算?在這種情況下,三元運算子不是一...
    程式設計 發佈於2024-11-08
  • 從打字機到像素:CMYK、RGB 和建立色彩視覺化工具的旅程
    從打字機到像素:CMYK、RGB 和建立色彩視覺化工具的旅程
    當我還是個孩子的時候,我出版了一本關於漫畫的粉絲雜誌。那是在我擁有計算機之前很久——它是用打字機、紙和剪刀創建的! 粉絲雜誌最初是黑白的,在我的學校複印的。隨著時間的推移,隨著它取得了更大的成功,我能夠負擔得起帶有彩色封面的膠印! 然而,管理這些顏色非常具有挑戰性。每個封面必須列印四次,每種顏色...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3