Laravel權(quán)限功能的技巧:如何實(shí)現(xiàn)權(quán)限繼承與繼承關(guān)係管理
Nov 04, 2023 am 09:28 AMLaravel 是一框架,它有豐富的特性能夠快速開發(fā) Web 應(yīng)用程式。其權(quán)限功能就是其中之一。在本文中,我們將開始學(xué)習(xí) Laravel 權(quán)限系統(tǒng)的兩個(gè)關(guān)鍵問題:權(quán)限繼承和繼承關(guān)係管理,並將實(shí)作功能程式碼的示範(fàn)。
權(quán)限繼承
權(quán)限繼承是指將權(quán)限從一個(gè)角色傳遞到另一個(gè)角色。在某些情況下,有必要將權(quán)限指派給一個(gè)角色,然後將這些權(quán)限傳遞給更具體的角色。例如,如果我們要管理某個(gè)單位的權(quán)限,則可以授予單位管理員所有的單位權(quán)限。而不必為每個(gè)員工分配權(quán)限。
Laravel 提供了「權(quán)限繼承」功能,我們可以使用它將權(quán)限從一個(gè)角色傳遞到另一個(gè)角色。讓我們開始學(xué)習(xí)如何實(shí)現(xiàn)這個(gè)功能。
在開始之前,我們需要建立資料庫。我們將建立兩個(gè)表: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 表來儲(chǔ)存角色,包括 id、name 和 parent_id 欄位。 id 欄位是一個(gè)主鍵,必須唯一。 name 欄位將儲(chǔ)存角色名稱。 parent_id 欄位是可選的,它表示該角色的父角色。我們還將建立 permissions 表,其中包括 id 和 name 欄位。 id 欄位是一個(gè)主鍵,必須唯一。 name 欄位將儲(chǔ)存權(quán)限名稱。
下面是roles 表的範(fàn)例資料:
INSERT INTO `roles` (`id`, `name`, `parent_id`) VALUES (1, 'Admin', NULL), (2, 'Manager', 1), (3, 'User', 2);
在上述範(fàn)例資料中,我們建立了三個(gè)角色,第一個(gè)角色稱為“Admin”,它沒有父角色;第二個(gè)角色稱為“Manager”,它的父角色是“Admin”;第三個(gè)角色稱為“User”,它的父角色是“Manager”。
現(xiàn)在,我們要實(shí)作權(quán)限繼承功能。為此,我們需要建立一個(gè)函數(shù),該函數(shù)將接收一個(gè)角色 ID,找到該角色的所有父角色,並傳回這些角色的權(quán)限。我們還將實(shí)作另一個(gè)函數(shù),該函數(shù)將接收一個(gè)角色 ID 和一個(gè)權(quán)限名稱,並檢查該角色是否具有該權(quán)限,無論是直接授予該權(quán)限還是透過繼承該權(quán)限。
下面是取得角色的所有父角色的函數(shù):
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; }
以上程式碼建立了一個(gè) $permissions 數(shù)組,並從指定的角色開始遍歷角色的父角色。當(dāng)找到父角色時(shí),將其所有權(quán)限新增至 $permissions 陣列。如果找不到父角色,while 迴圈將終止,並傳回 $permissions 陣列。
現(xiàn)在,我們將實(shí)作另一個(gè)函數(shù),該函數(shù)將接收角色 ID 和權(quán)限名稱,並檢查該角色是否具有該權(quán)限。以下是該函數(shù)的程式碼:
public function hasRolePermission($roleId, $permissionName) { $permissions = $this->getPermissionsByRoleId($roleId); foreach($permissions as $permission) { if($permission->name == $permissionName) { return true; } } return false; }
以上程式碼呼叫了 getPermissionsByRoleId 函數(shù)以取得角色的所有權(quán)限,並將其迭代以??找到指定的權(quán)限。如果找到該權(quán)限,則函數(shù)將傳回 true。否則,它將傳回 false。
現(xiàn)在我們已經(jīng)學(xué)會(huì)如何實(shí)現(xiàn)權(quán)限繼承,接下來重點(diǎn)學(xué)習(xí) Laravel 如何實(shí)現(xiàn)繼承關(guān)係管理。
繼承關(guān)係管理
在某些情況下,有必要建立繼承關(guān)係,並在應(yīng)用程式中使用它們。例如,如果我們有一個(gè)部門管理應(yīng)用程序,則每個(gè)部門都可以有管理者。而管理者與該部門之間的關(guān)係可以透過繼承關(guān)係來建立。
在 Laravel 中,我們可以使用「多型關(guān)聯(lián)」功能建立繼承關(guān)係。讓我們開始學(xué)習(xí)如何實(shí)現(xiàn)它。
我們將建立一個(gè) departments 資料表。 departments 表將表示應(yīng)用程式中的部門,包括 id、name 和 parent_id 欄位。 id 欄位是一個(gè)主鍵,必須唯一。 name 欄位名稱將儲(chǔ)存部門名稱。 parent_id 欄位是可選的,它表示該部門的父部門。此外,我們還將建立一個(gè) users 表。此表包含了一個(gè)使用者的基本訊息,包括 id 和 name 欄位。我們還需要建立一個(gè) userables 表。此表格將包含 user_id、userable_id 和 userable_type 欄位。其中,user_id 欄位是外鍵,指向 users 表中的 id 欄位。 userable_id 和 userable_type 字段是多態(tài)字段,它們表示使用者與其相關(guān)聯(lián)的任何模型。
下面是所需資料表結(jié)構(gòu)和範(fàn)例資料:
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');
在以上範(fàn)例資料中,我們建立了一個(gè)名為「Administration」的部門,它沒有父部門;名為「Finance 」、「Sales」、「IT」的部門有「Administration」部門作為他們的父部門。另外,名為「Accounts Payable」和「Accounts Receivable」部門有「Finance」部門作為他們的父部門。名為「Engineering」的部門有「IT」部門作為它的父部門。 「Development」和「Testing」部門有「Engineering」部門作為他們的父級部門。
我們將使用這些部門和使用者資料來建立繼承關(guān)係。
以下是 userables 資料表與部門之間的多態(tài)關(guān)聯(lián):
class Userable extends Model { public function userable() { return $this->morphTo(); } public function user() { return $this->belongsTo(User::class); } }
以上代碼定義了 userable 函數(shù)。該函數(shù)返回與 userable 模型相關(guān)聯(lián)的模型。在我們的情況下,userable 將返回 Department 模型或任何其他相關(guān)模型。
接下來,我們定義 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'); } }
以上代碼定義了三個(gè)函數(shù)。users 函數(shù)返回將 Userable id 與當(dāng)前模型實(shí)例相關(guān)聯(lián)的所有 User 實(shí)例。parent 函數(shù)返回這個(gè)部門的一個(gè)父級部門。children 函數(shù)返回所有直接關(guān)聯(lián)的部門。
現(xiàn)在,我們可以使用這些函數(shù)來獲取一個(gè)部門的所有直接用戶。以下是 getAllUsers 函數(shù)。
public function getAllUsers() { $users = []; foreach($this->users as $user) { $users[] = $user->user; } return $users; }
此函數(shù)將從當(dāng)前部門中檢索所有用戶,并返回一個(gè)數(shù)組,其中包含這些用戶。
最后,我們將定義 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; } }
以上代碼定義了三個(gè)函數(shù)。userables 函數(shù)返回該用戶的所有可關(guān)聯(lián)實(shí)例。departments 函數(shù)返回與此用戶相關(guān)聯(lián)的所有部門。getDepartmentAttribute 函數(shù)將從 userables 中找到所有 Department 實(shí)例,并返回它們中的第一個(gè)。
以上所有代碼示例可以一起使用,以計(jì)劃實(shí)現(xiàn) Laravel 權(quán)限系統(tǒng)的兩個(gè)主要問題:權(quán)限繼承和繼承關(guān)系管理。
以上是Laravel權(quán)限功能的技巧:如何實(shí)現(xiàn)權(quán)限繼承與繼承關(guān)係管理的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

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

如何在Laravel中實(shí)現(xiàn)基於權(quán)限的多語言支援導(dǎo)語:在現(xiàn)代的網(wǎng)站和應(yīng)用程式中,多語言支援是非常常見的需求。而對於一些複雜的系統(tǒng),我們可能還需要根據(jù)使用者的權(quán)限動(dòng)態(tài)顯示不同的語言翻譯。 Laravel是一個(gè)非常流行的PHP框架,它提供了許多強(qiáng)大的功能來簡化開發(fā)流程。本文將介紹如何在Laravel中實(shí)現(xiàn)基於權(quán)限的多語言支持,並提供具體的程式碼範(fàn)例。步驟一:設(shè)定多語言支援首

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

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

Laravel權(quán)限功能的實(shí)用技巧:如何實(shí)現(xiàn)權(quán)限的自動(dòng)同步和更新簡介:Laravel是一個(gè)流行的PHP開發(fā)框架,提供了強(qiáng)大的權(quán)限管理功能,可以用於管理系統(tǒng)中使用者的存取權(quán)限。在較大的系統(tǒng)中,權(quán)限的管理可能非常複雜,因此如何實(shí)現(xiàn)權(quán)限的自動(dòng)同步和更新是一個(gè)很有用的技巧。本文將介紹如何使用Laravel的權(quán)限管理功能實(shí)現(xiàn)權(quán)限的自動(dòng)同步與更新。一、使用Laravel的權(quán)

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

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

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

Laravel權(quán)限功能的實(shí)踐案例:如何應(yīng)對權(quán)限升級和遷移,需要具體程式碼範(fàn)例隨著專案的不斷發(fā)展和業(yè)務(wù)的擴(kuò)大,權(quán)限管理成為了一個(gè)關(guān)鍵的議題。在Laravel框架中,Laravel權(quán)限功能為我們提供了一個(gè)非常便利且強(qiáng)大的權(quán)限管理工具。但是,在專案中頻繁進(jìn)行權(quán)限升級和遷移的情況下,我們需要一套可靠的策略來確保系統(tǒng)的安全和穩(wěn)定。本文將使用具體的程式碼範(fàn)例,介紹如何應(yīng)對權(quán)限升
