Heim > PHP-Framework > Denken Sie an PHP > So implementieren Sie mit ThinkPHP6 die Berechtigungsverwaltung für Benutzerrollen

So implementieren Sie mit ThinkPHP6 die Berechtigungsverwaltung für Benutzerrollen

WBOY
Freigeben: 2023-06-20 22:06:27
Original
1575 Leute haben es durchsucht

Angesichts der kontinuierlichen Geschäftsentwicklung verfügen viele kleine und mittlere Unternehmen über eigene Benutzerverwaltungssysteme, und die Verwaltung von Benutzerrechten ist ein wichtiger Bestandteil davon. Um vertrauliche Informationen im System zu schützen und den normalen Geschäftsbetrieb sicherzustellen, müssen wir einen Rollenberechtigungsverwaltungsmechanismus verwenden, um sicherzustellen, dass Benutzer mit unterschiedlichen Rollen nur auf bestimmte Ressourcen und Daten zugreifen können.

In diesem Artikel wird das ThinkPHP6-Framework als Beispiel verwendet, um vorzustellen, wie die von ihm bereitgestellte Berechtigungskontroll-Middleware und Erweiterungspakete zur Implementierung der Benutzerrollen-Berechtigungsverwaltung verwendet werden.

  1. Rollentabelle und Berechtigungstabelle erstellen

Zuerst müssen wir zwei Datenbanktabellen definieren, eine ist die Rollentabelle, die zum Speichern von Systemrolleninformationen verwendet wird, und die andere ist die Berechtigungstabelle, die zum Speichern von Systemberechtigungsinformationen verwendet wird.

CREATE TABLE role (role (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
name varchar(20) NOT NULL COMMENT '角色名称',
description varchar(50) NOT NULL COMMENT '角色描述',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

CREATE TABLE permission (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
name varchar(20) NOT NULL COMMENT '权限名称',
description varchar(50) NOT NULL COMMENT '权限描述',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限表';

我们可以使用ThinkPHP提供的数据库迁移工具来创建表:php think migrate:run。

  1. 创建角色和权限模型

接下来,我们需要创建角色和权限的模型。在app/model目录下创建Role.php和Permission.php文件,代码如下:

namespace appmodel;

use thinkModel;

class Role extends Model
{

protected $table = 'role';
Nach dem Login kopieren

}

namespace appmodel;

use thinkModel;

class Permission extends Model
{

protected $table = 'permission';
Nach dem Login kopieren

}

  1. 创建角色和权限关联表

由于一个用户可能拥有多个角色,一个角色也可能对应多个权限,所以我们需要创建一个角色和权限的关联表。在数据库中创建一个role_permission表。

CREATE TABLE role_permission (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
role_id int(11) NOT NULL COMMENT '角色ID',
permission_id int(11) NOT NULL COMMENT '权限ID',
PRIMARY KEY (id),
KEY role_id (role_id),
KEY permission_id (permission_id id int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
name varchar(20) NOT NULL COMMENT 'Rollenname',

description varchar(50) NOT NULL COMMENT 'Rollenbeschreibung',

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT = 'Role table';


CREATE TABLE permission (

id int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',

name varchar( 20) NOT NULL COMMENT 'Berechtigungsname',

description varchar(50) NOT NULL COMMENT 'Berechtigungsbeschreibung',

PRIMARY KEY (id)
) ENGINE= InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Permission Table';

Wir können das von ThinkPHP bereitgestellte Datenbankmigrationstool verwenden, um die Tabelle zu erstellen: php think migrate:run.

    Erstellen Sie Rollen- und Berechtigungsmodelle

    Als nächstes müssen wir Rollen- und Berechtigungsmodelle erstellen. Erstellen Sie die Dateien Role.php und Permission.php im Verzeichnis app/model. Der Code lautet wie folgt:

    namespace appmodel;

    use thinkModel;

      class Role erweitert Model
    1. {
    2. protected $table = 'role';
      
      public function permissions()
      {
          return $this->belongsToMany(
              Permission::class,
              'role_permission',
              'role_id',
              'permission_id'
          );
      }
      Nach dem Login kopieren
    }

    ?< Wenn Sie mehrere Rollen haben, kann eine Rolle auch mehreren Berechtigungen entsprechen. Daher müssen wir eine Zuordnungstabelle für Rollen und Berechtigungen erstellen. Erstellen Sie eine Role_permission-Tabelle in der Datenbank.

    CREATE TABLE role_permission (
    id int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',

    role_id int(11) NOT NULL KOMMENTAR 'Rollen-ID',

    permission_id int(11) NICHT NULL KOMMENTAR 'Berechtigungs-ID',
    PRIMÄRSCHLÜSSEL (id),
    SCHLÜSSEL role_id</code > (<code>role_id),

    KEY permission_id (permission_id)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Rollen-Berechtigungs-Zuordnungstabelle' ;

    Definieren Sie die Viele-zu-Viele-Beziehung von Rollen und Berechtigungen im Modell:

    namespace appmodel;

      use thinkModel;
    1. class Role erweitert Model
    {

    protected $table = 'permission';
    
    public function roles()
    {
        return $this->belongsToMany(
            Role::class,
            'role_permission',
            'permission_id',
            'role_id'
        );
    }
    Nach dem Login kopieren

    }


    < ?php

    namespace appmodel;

    use thinkModel;

    class Permission erweitert Model
      {
    1. public function handle($request, Closure $next)
      {
          if (Session::has('user')) {
              $roles = Db::table('user')
                  ->alias('u')
                  ->leftJoin('role_user ru', 'u.id = ru.user_id')
                  ->leftJoin('role r', 'ru.role_id = r.id')
                  ->where('u.id', '=', Session::get('user')->id)
                  ->field('r.id')
                  ->select();
              $permissions = Config::get('permissions');
              foreach ($roles as $role) {
                  $rolePermissions = Db::table('role_permission')
                      ->where('role_id', '=', $role->id)
                      ->field('permission_id')
                      ->select();
                  foreach ($rolePermissions as $rolePermission) {
                      if (in_array($rolePermission->permission_id, $permissions)) {
                          return $next($request);
                      }
                  }
              }
          }
          abort(403, '没有权限');
      }
      Nach dem Login kopieren
    2. }

    Middleware definieren


    In ThinkPHP6 ist Middleware ein leistungsstarkes Tool zur Verarbeitung von Anfragen. Wir können die Berechtigungskontrolle über Middleware implementieren . Erstellen Sie eine CheckAuth-Middleware, um festzustellen, ob der Benutzer berechtigt ist, den aktuellen Vorgang auszuführen. Erstellen Sie die Datei CheckAuth.php im Verzeichnis appmiddleware mit dem folgenden Code:

    namespace appmiddleware;

    use think acadeDb;

    use think acadeSession;

    use think acadeConfig;

    class CheckAuth

    {

    1 => 'user.create',
    2 => 'user.read',
    3 => 'user.update',
    4 => 'user.delete',
    Nach dem Login kopieren

    }

    Diese Middleware fragt zunächst alle Rollen ab, die dem aktuellen Benutzer gehören. Wenn Berechtigungen vorhanden sind, die mit der aktuellen Anforderung übereinstimmen, wird die Ausführung fortgesetzt, andernfalls wird ein 403-Fehler angezeigt wird zurückgegeben.

    Berechtigungskonfigurationsdatei erstellen

    🎜🎜Um die Verwaltung von Systemberechtigungen zu erleichtern, können wir die von ThinkPHP bereitgestellte Konfigurationsfunktion verwenden, um alle Berechtigungen in die Konfigurationsdatei zu schreiben. Erstellen Sie eine Datei „permissions.php“ im Konfigurationsverzeichnis. Der Code lautet wie folgt: 🎜🎜
    // ...
    'check_auth' => appmiddlewareCheckAuth::class,
    Nach dem Login kopieren
🎜];🎜🎜Wir können alle Berechtigungen des Systems in Form von Schlüssel/Wert aufzeichnen. Der Schlüssel ist ein ganzzahliger Wert, der den Namen der Berechtigung darstellt. 🎜🎜🎜Middleware anwenden🎜🎜🎜Abschließend müssen wir die oben genannte Middleware tatsächlich anwenden. Öffnen Sie die Datei middleware.php im Konfigurationsverzeichnis und fügen Sie die CheckAuth-Middleware hinzu. 🎜🎜
public function create()
{
    $this->middleware('check_auth');
    // ...
}
Nach dem Login kopieren
🎜];🎜🎜Die Anwendungsreihenfolge der Middleware wird von vorne nach hinten entsprechend dem Schlüsselnamen des Arrays ausgeführt. Wir können die Ausführungsreihenfolge der Middleware über den Array-Index anpassen. 🎜🎜Auf Controllern oder Methoden, die eine Berechtigungskontrolle erfordern, können Sie die Middleware-Methode verwenden, um die CheckAuth-Middleware zu binden. 🎜🎜Das obige ist der detaillierte Inhalt vonSo implementieren Sie mit ThinkPHP6 die Berechtigungsverwaltung für Benutzerrollen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Vorheriger Artikel:Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit ThinkPHP6 hervorragende Projekte entwickeln Nächster Artikel:So verwenden Sie ThinkPHP6, um zu erreichen, dass keine Anmeldung erforderlich ist
Erklärung dieser Website
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
Neueste Artikel des Autors
Aktuelle Ausgaben
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage