Heim  >  Artikel  >  PHP-Framework  >  Tipps zur Laravel-Berechtigungsfunktion: So implementieren Sie die Berechtigungsvererbung und die Verwaltung von Vererbungsbeziehungen

Tipps zur Laravel-Berechtigungsfunktion: So implementieren Sie die Berechtigungsvererbung und die Verwaltung von Vererbungsbeziehungen

PHPz
PHPzOriginal
2023-11-04 09:28:49835Durchsuche

Tipps zur Laravel-Berechtigungsfunktion: So implementieren Sie die Berechtigungsvererbung und die Verwaltung von Vererbungsbeziehungen

Laravel ist ein Framework mit umfangreichen Funktionen zur schnellen Entwicklung von Webanwendungen. Die Berechtigungsfunktion ist eine davon. In diesem Artikel lernen wir zunächst zwei Schlüsselthemen des Berechtigungssystems von Laravel kennen: Berechtigungsvererbung und Vererbungsbeziehungsmanagement, und implementieren eine Demonstration von Funktionscode.

Berechtigungsvererbung

Berechtigungsvererbung bezieht sich auf die Weitergabe von Berechtigungen von einer Rolle an eine andere. In manchen Fällen ist es notwendig, einer Rolle Berechtigungen zuzuweisen und diese Berechtigungen dann an eine spezifischere Rolle weiterzugeben. Wenn wir beispielsweise Berechtigungen für eine Organisation verwalten möchten, können wir dem Einheitenadministrator alle Organisationsberechtigungen erteilen. Anstatt jedem Mitarbeiter Berechtigungen zuweisen zu müssen.

Laravel bietet die Funktion „Permission Inheritance“, mit der wir Berechtigungen von einer Rolle an eine andere weitergeben können. Beginnen wir mit dem Erlernen der Implementierung dieser Funktionalität.

Bevor wir beginnen, müssen wir eine Datenbank erstellen. Wir werden zwei Tabellen erstellen: Rollen und Berechtigungen.

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;

Wir erstellen eine Rollentabelle zum Speichern von Rollen, einschließlich der Felder „id“, „name“ und „parent_id“. Das ID-Feld ist ein Primärschlüssel und muss eindeutig sein. Im Namensfeld wird der Rollenname gespeichert. Das Feld parent_id ist optional und stellt die übergeordnete Rolle dieser Rolle dar. Wir erstellen auch die Berechtigungstabelle, die ID- und Namensfelder enthält. Das ID-Feld ist ein Primärschlüssel und muss eindeutig sein. Im Namensfeld wird der Berechtigungsname gespeichert.

Das Folgende sind Beispieldaten der Rollentabelle:

rrree

In den obigen Beispieldaten haben wir drei Rollen erstellt. Die erste Rolle heißt „Admin“, die zweite Rolle heißt „Manager“. seine übergeordnete Rolle ist „Admin“, die dritte Rolle heißt „Benutzer“ und seine übergeordnete Rolle ist „Manager“.

Jetzt müssen wir die Berechtigungsvererbungsfunktion implementieren. Dazu müssen wir eine Funktion erstellen, die eine Rollen-ID erhält, alle übergeordneten Rollen dieser Rolle findet und die Berechtigungen für diese Rollen zurückgibt. Wir implementieren außerdem eine weitere Funktion, die eine Rollen-ID und einen Berechtigungsnamen empfängt und prüft, ob die Rolle über diese Berechtigung verfügt, indem sie diese entweder direkt erteilt oder erbt.

Hier ist die Funktion, um alle übergeordneten Rollen einer Rolle abzurufen:

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

Der obige Code erstellt ein $permissions-Array und durchläuft die übergeordneten Rollen der Rolle, beginnend mit der angegebenen Rolle. Wenn die übergeordnete Rolle gefunden wird, fügen Sie alle ihre Berechtigungen zum Array $permissions hinzu. Wenn die übergeordnete Rolle nicht gefunden wird, wird die while-Schleife beendet und das Array $permissions zurückgegeben.

Jetzt implementieren wir eine weitere Funktion, die die Rollen-ID und den Berechtigungsnamen empfängt und prüft, ob die Rolle über diese Berechtigung verfügt. Hier ist der Code für die Funktion:

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;
}

Der obige Code ruft die Funktion getPermissionsByRoleId auf, um alle Berechtigungen für die Rolle abzurufen, und iteriert sie, um die angegebene Berechtigung zu finden. Wenn die Berechtigung gefunden wird, gibt die Funktion „true“ zurück. Andernfalls wird false zurückgegeben.

Da wir nun gelernt haben, wie man die Berechtigungsvererbung implementiert, konzentrieren wir uns darauf, zu lernen, wie Laravel die Verwaltung von Vererbungsbeziehungen implementiert.

Vererbungsbeziehungsmanagement

In manchen Fällen ist es notwendig, Erbbeziehungen anzulegen und diese in der Bewerbung zu verwenden. Wenn wir beispielsweise über eine Abteilungsverwaltungsanwendung verfügen, kann jede Abteilung einen Manager haben. Die Beziehung zwischen dem Manager und der Abteilung kann durch Vererbung hergestellt werden.

In Laravel können wir die Funktion „polymorphe Assoziation“ verwenden, um Vererbungsbeziehungen herzustellen. Beginnen wir mit der Umsetzung.

Wir erstellen eine Abteilungsdatentabelle. Die Tabelle „departments“ stellt die Abteilungen in der Anwendung dar und enthält die Felder „id“, „name“ und „parent_id“. Das ID-Feld ist ein Primärschlüssel und muss eindeutig sein. Im Namensfeld wird der Abteilungsname gespeichert. Das Feld parent_id ist optional und stellt die übergeordnete Abteilung dieser Abteilung dar. Zusätzlich erstellen wir eine Benutzertabelle. Diese Tabelle enthält grundlegende Informationen über einen Benutzer, einschließlich der Felder „ID“ und „Name“. Wir müssen auch eine Userables-Tabelle erstellen. Die Tabelle enthält die Felder user_id, userable_id und userable_type. Unter diesen ist das Feld user_id ein Fremdschlüssel, der auf das ID-Feld in der Benutzertabelle verweist. Die Felder „userable_id“ und „userable_type“ sind polymorphe Felder, die das Modell darstellen, mit dem der Benutzer verknüpft ist.

Das Folgende ist die erforderliche Datentabellenstruktur und Beispieldaten:

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

In den obigen Beispieldaten haben wir eine Abteilung mit dem Namen „Verwaltung“ erstellt, die keine übergeordnete Abteilung mit den Namen „Finanzen“, „Vertrieb“ und „IT“ hat. „Abteilungen haben die Abteilung „Verwaltung“ als übergeordnete Abteilung. Darüber hinaus haben die Abteilungen „Kreditorenbuchhaltung“ und „Debitorenbuchhaltung“ die Abteilung „Finanzen“ als übergeordnete Abteilung. Eine Abteilung namens „Engineering“ hat die Abteilung „IT“ als übergeordnete Abteilung. Die Abteilungen „Entwicklung“ und „Testing“ haben die Abteilung „Engineering“ als übergeordnete Abteilung.

Wir werden diese Abteilungs- und Benutzerdaten verwenden, um Vererbungsbeziehungen herzustellen.

Das Folgende ist die polymorphe Zuordnung zwischen der Benutzertabelle und den Abteilungen:

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 权限系统的两个主要问题:权限继承和继承关系管理。

Das obige ist der detaillierte Inhalt vonTipps zur Laravel-Berechtigungsfunktion: So implementieren Sie die Berechtigungsvererbung und die Verwaltung von Vererbungsbeziehungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn