首頁 php框架 Laravel Laravel權限功能的技巧:如何實現權限繼承與繼承關係管理

Laravel權限功能的技巧:如何實現權限繼承與繼承關係管理

Nov 04, 2023 am 09:28 AM
laravel權限 權限繼承 繼承關係管理

Laravel權限功能的技巧:如何實現權限繼承與繼承關係管理

Laravel 是一框架,它有豐富的特性能夠快速開發 Web 應用程式。其權限功能就是其中之一。在本文中,我們將開始學習 Laravel 權限系統的兩個關鍵問題:權限繼承和繼承關係管理,並將實作功能程式碼的示範。

權限繼承

權限繼承是指將權限從一個角色傳遞到另一個角色。在某些情況下,有必要將權限指派給一個角色,然後將這些權限傳遞給更具體的角色。例如,如果我們要管理某個單位的權限,則可以授予單位管理員所有的單位權限。而不必為每個員工分配權限。

Laravel 提供了「權限繼承」功能,我們可以使用它將權限從一個角色傳遞到另一個角色。讓我們開始學習如何實現這個功能。

在開始之前,我們需要建立資料庫。我們將建立兩個表:roles 和 permissions。

CREATE TABLE `roles` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `parent_id` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `permissions` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
登入後複製

我們將建立 roles 表來儲存角色,包括 id、name 和 parent_id 欄位。 id 欄位是一個主鍵,必須唯一。 name 欄位將儲存角色名稱。 parent_id 欄位是可選的,它表示該角色的父角色。我們還將建立 permissions 表,其中包括 id 和 name 欄位。 id 欄位是一個主鍵,必須唯一。 name 欄位將儲存權限名稱。

下面是roles 表的範例資料:

INSERT INTO `roles` (`id`, `name`, `parent_id`) VALUES
(1, 'Admin', NULL),
(2, 'Manager', 1),
(3, 'User', 2);
登入後複製

在上述範例資料中,我們建立了三個角色,第一個角色稱為“Admin”,它沒有父角色;第二個角色稱為“Manager”,它的父角色是“Admin”;第三個角色稱為“User”,它的父角色是“Manager”。

現在,我們要實作權限繼承功能。為此,我們需要建立一個函數,該函數將接收一個角色 ID,找到該角色的所有父角色,並傳回這些角色的權限。我們還將實作另一個函數,該函數將接收一個角色 ID 和一個權限名稱,並檢查該角色是否具有該權限,無論是直接授予該權限還是透過繼承該權限。

下面是取得角色的所有父角色的函數:

public function getPermissionsByRoleId($roleId) {
    $permissions = [];
    $role = Role::find($roleId);
    while($role) {
        $parent = Role::find($role->parent_id);
        if($parent) {
            $permissions = array_merge($permissions, $parent->permissions);
        }
        $role = $parent;
    }
    return $permissions;
}
登入後複製

以上程式碼建立了一個 $permissions 數組,並從指定的角色開始遍歷角色的父角色。當找到父角色時,將其所有權限新增至 $permissions 陣列。如果找不到父角色,while 迴圈將終止,並傳回 $permissions 陣列。

現在,我們將實作另一個函數,該函數將接收角色 ID 和權限名稱,並檢查該角色是否具有該權限。以下是該函數的程式碼:

public function hasRolePermission($roleId, $permissionName) {
    $permissions = $this->getPermissionsByRoleId($roleId);
    foreach($permissions as $permission) {
        if($permission->name == $permissionName) {
            return true;
        }
    }
    return false;
}
登入後複製

以上程式碼呼叫了 getPermissionsByRoleId 函數以取得角色的所有權限,並將其迭代以​​找到指定的權限。如果找到該權限,則函數將傳回 true。否則,它將傳回 false。

現在我們已經學會如何實現權限繼承,接下來重點學習 Laravel 如何實現繼承關係管理。

繼承關係管理

在某些情況下,有必要建立繼承關係,並在應用程式中使用它們。例如,如果我們有一個部門管理應用程序,則每個部門都可以有管理者。而管理者與該部門之間的關係可以透過繼承關係來建立。

在 Laravel 中,我們可以使用「多型關聯」功能建立繼承關係。讓我們開始學習如何實現它。

我們將建立一個 departments 資料表。 departments 表將表示應用程式中的部門,包括 id、name 和 parent_id 欄位。 id 欄位是一個主鍵,必須唯一。 name 欄位名稱將儲存部門名稱。 parent_id 欄位是可選的,它表示該部門的父部門。此外,我們還將建立一個 users 表。此表包含了一個使用者的基本訊息,包括 id 和 name 欄位。我們還需要建立一個 userables 表。此表格將包含 user_id、userable_id 和 userable_type 欄位。其中,user_id 欄位是外鍵,指向 users 表中的 id 欄位。 userable_id 和 userable_type 字段是多態字段,它們表示使用者與其相關聯的任何模型。

下面是所需資料表結構和範例資料:

CREATE TABLE `departments` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `parent_id` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `users` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `userables` (
  `id` int(10) UNSIGNED NOT NULL,
  `user_id` int(10) UNSIGNED NOT NULL,
  `userable_id` int(10) UNSIGNED NOT NULL,
  `userable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `departments` (`id`, `name`, `parent_id`) VALUES
(1, 'Administration', NULL),
(2, 'Finance', 1),
(3, 'Sales', 1),
(4, 'IT', 1),
(5, 'Accounts Payable', 2),
(6, 'Accounts Receivable', 2),
(7, 'Engineering', 4),
(8, 'Development', 7),
(9, 'Testing', 7);

INSERT INTO `users` (`id`, `name`) VALUES
(1, 'User One'),
(2, 'User Two'),
(3, 'User Three');

INSERT INTO `userables` (`id`, `user_id`, `userable_id`, `userable_type`) VALUES
(1, 1, 1, 'Department'),
(2, 1, 2, 'Department'),
(3, 2, 3, 'Department'),
(4, 3, 9, 'Department');
登入後複製

在以上範例資料中,我們建立了一個名為「Administration」的部門,它沒有父部門;名為「Finance 」、「Sales」、「IT」的部門有「Administration」部門作為他們的父部門。另外,名為「Accounts Payable」和「Accounts Receivable」部門有「Finance」部門作為他們的父部門。名為「Engineering」的部門有「IT」部門作為它的父部門。 「Development」和「Testing」部門有「Engineering」部門作為他們的父級部門。

我們將使用這些部門和使用者資料來建立繼承關係。

以下是 userables 資料表與部門之間的多態關聯:

class Userable extends Model {
    public function userable() {
        return $this->morphTo();
    }

    public function user() {
        return $this->belongsTo(User::class);
    }
}
登入後複製

以上代码定义了 userable 函数。该函数返回与 userable 模型相关联的模型。在我们的情况下,userable 将返回 Department 模型或任何其他相关模型。

接下来,我们定义 Department 模型:

class Department extends Model {
    public function users() {
        return $this->morphMany(Userable::class, 'userable');
    }

    public function parent() {
        return $this->belongsTo(Department::class, 'parent_id');
    }

    public function children() {
        return $this->hasMany(Department::class, 'parent_id');
    }
}
登入後複製

以上代码定义了三个函数。users 函数返回将 Userable id 与当前模型实例相关联的所有 User 实例。parent 函数返回这个部门的一个父级部门。children 函数返回所有直接关联的部门。

现在,我们可以使用这些函数来获取一个部门的所有直接用户。以下是 getAllUsers 函数。

public function getAllUsers() {
    $users = [];
    foreach($this->users as $user) {
        $users[] = $user->user;
    }
    return $users;
}
登入後複製

此函数将从当前部门中检索所有用户,并返回一个数组,其中包含这些用户。

最后,我们将定义 User 模型:

class User extends Model {
    public function userables() {
        return $this->hasMany(Userable::class);
    }

    public function departments() {
        return $this->morphToMany(Department::class, 'userable');
    }

    public function getDepartmentAttribute() {
        $department = null;
        foreach($this->userables as $userable) {
            if($userable->userable_type == 'Department') {
                $department = $userable->userable;
                break;
            }
        }
        return $department;
    }
}
登入後複製

以上代码定义了三个函数。userables 函数返回该用户的所有可关联实例。departments 函数返回与此用户相关联的所有部门。getDepartmentAttribute 函数将从 userables 中找到所有 Department 实例,并返回它们中的第一个。

以上所有代码示例可以一起使用,以计划实现 Laravel 权限系统的两个主要问题:权限继承和继承关系管理。

以上是Laravel權限功能的技巧:如何實現權限繼承與繼承關係管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1419
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
如何在Laravel中實現基於權限的多語言支持 如何在Laravel中實現基於權限的多語言支持 Nov 02, 2023 am 08:22 AM

如何在Laravel中實現基於權限的多語言支援導語:在現代的網站和應用程式中,多語言支援是非常常見的需求。而對於一些複雜的系統,我們可能還需要根據使用者的權限動態顯示不同的語言翻譯。 Laravel是一個非常流行的PHP框架,它提供了許多強大的功能來簡化開發流程。本文將介紹如何在Laravel中實現基於權限的多語言支持,並提供具體的程式碼範例。步驟一:設定多語言支援首

Laravel權限功能的實戰應用:如何實現使用者組織架構權限控制 Laravel權限功能的實戰應用:如何實現使用者組織架構權限控制 Nov 02, 2023 am 08:17 AM

Laravel權限功能的實戰應用:如何實現使用者組織架構權限控制,需要具體程式碼範例引言:隨著Web應用的快速發展,使用者權限控製成為一個重要的功能需求。 Laravel作為一個受歡迎的PHP框架,提供了靈活且強大的權限管理功能。本文將介紹如何使用Laravel實現使用者組織架構權限控制,並給出具體的程式碼範例。一、使用者組織架構權限控制的需求在許多應用中,使用者權限通常是按

Laravel權限功能的技巧:如何實現權限繼承與繼承關係管理 Laravel權限功能的技巧:如何實現權限繼承與繼承關係管理 Nov 04, 2023 am 09:28 AM

Laravel是一框架,它有豐富的特性能夠快速開發Web應用程式。其權限功能就是其中之一。在本文中,我們將開始學習Laravel權限系統的兩個關鍵問題:權限繼承和繼承關係管理,並將實作功能程式碼的示範。權限繼承權限繼承是指將權限從一個角色傳遞到另一個角色。在某些情況下,有必要將權限指派給一個角色,然後將這些權限傳遞給更具體的角色。例如,如果我們要管理某

Laravel權限功能的實用技巧:如何實現權限的自動同步與更新 Laravel權限功能的實用技巧:如何實現權限的自動同步與更新 Nov 02, 2023 pm 07:02 PM

Laravel權限功能的實用技巧:如何實現權限的自動同步和更新簡介:Laravel是一個流行的PHP開發框架,提供了強大的權限管理功能,可以用於管理系統中使用者的存取權限。在較大的系統中,權限的管理可能非常複雜,因此如何實現權限的自動同步和更新是一個很有用的技巧。本文將介紹如何使用Laravel的權限管理功能實現權限的自動同步與更新。一、使用Laravel的權

Laravel權限功能的實戰經驗:如何處理權限衝突和重疊 Laravel權限功能的實戰經驗:如何處理權限衝突和重疊 Nov 03, 2023 am 08:39 AM

Laravel權限功能的實戰經驗:如何處理權限衝突和重疊引言:在開發Web應用程式時,權限管理是一個非常重要的任務。 Laravel框架提供了許多方便的工具和功能來處理權限控制。然而,在實際開發過程中,有時會遇到一些權限衝突和重疊的問題,這需要我們仔細處理,確保權限的正確性和一致性。本文將分享一些實戰經驗,以及如何運用Laravel來處理這些問題。同時,我

Laravel權限功能的可靠性保證:如何實現權限的冗餘備份與復原 Laravel權限功能的可靠性保證:如何實現權限的冗餘備份與復原 Nov 02, 2023 am 08:44 AM

Laravel權限功能的可靠性保證:如何實現權限的冗餘備份和恢復,需要具體程式碼範例引言:隨著Web應用的快速發展,系統中權限管理變得越來越重要。 Laravel作為一種流行的PHP框架,提供了便利的權限管理功能。然而,權限資料的遺失或意外修改可能導致系統功能異常甚至資料外洩。因此,實現權限的冗餘備份和復原是確保系統可靠性的重要一環。本文將介紹如何在Larave

Laravel權限功能的實務案例:如何應對權限升級與遷移 Laravel權限功能的實務案例:如何應對權限升級與遷移 Nov 03, 2023 am 11:48 AM

Laravel權限功能的實踐案例:如何應對權限升級和遷移,需要具體程式碼範例隨著專案的不斷發展和業務的擴大,權限管理成為了一個關鍵的議題。在Laravel框架中,Laravel權限功能為我們提供了一個非常便利且強大的權限管理工具。但是,在專案中頻繁進行權限升級和遷移的情況下,我們需要一套可靠的策略來確保系統的安全和穩定。本文將使用具體的程式碼範例,介紹如何應對權限升

Laravel權限功能的高階特性:如何實現多維度的權限控制 Laravel權限功能的高階特性:如何實現多維度的權限控制 Nov 03, 2023 pm 03:32 PM

Laravel權限功能的高階特性:如何實現多維度的權限控制,需要具體程式碼範例引言:隨著業務的複雜性增加,權限控制在Web應用中扮演著至關重要的角色。 Laravel作為一款受歡迎的PHP框架,為我們提供了強大且靈活的權限功能。除了基本的角色和權限管理外,Laravel還支援多維度的權限控制,即可根據使用者、角色、資源和操作進行細粒度的權限控制。本文將介紹如何使用

See all articles