Das Beispiel in diesem Artikel beschreibt die Implementierungsmethode der Laravel5-Berechtigungsverwaltung. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
Gedanken zur Berechtigungsverwaltung
Kürzlich habe ich Laravel verwendet, um das Backend zu entwerfen, und das Backend muss über eine Berechtigungsverwaltung verfügen. Die Berechtigungsverwaltung gliedert sich im Wesentlichen in zwei Teile: zunächst die Authentifizierung und dann die Berechtigungen. Der Authentifizierungsteil ist sehr einfach durchzuführen, das heißt, der Administrator meldet sich an und zeichnet die Sitzung auf. Laravel bringt auch Auth mit, um dies zu implementieren. Am problematischsten ist die Berechtigungsauthentifizierung.
Bei der Berechtigungsauthentifizierung geht es im Wesentlichen darum, wer die Autorität hat, was zu verwalten. Hier gibt es zwei Dimensionen. In der Benutzerdimension kann die Granularität der Berechtigungsverwaltung ein Benutzer oder eine Gruppierung von Benutzern sein ? Wenn man dagegen etwas verwaltet, hat dieses Ding die Dimension von Dingen. Eine Seite ist ein Ding, und ein Element auf einer Seite ist auch ein Ding. Oder um es allgemeiner auszudrücken: eine Funktion ist ein Ding. Daher ist es für die Berechtigungsverwaltung am wichtigsten, die Granularität dieser beiden Dimensionen zu bestätigen. Das ist keine technische Angelegenheit mehr, das muss besprochen werden.
Basierend auf der obigen Überlegung basiert die Berechtigungsverwaltung, die ich dieses Mal durchführen möchte, auf Einzelpersonen in der Benutzerdimension. Es ist nur so, dass alle Berechtigungen unterschiedlich sind. In der Ost-West-Dimension habe ich die Route auf die kleinste Einheit eingestellt, also die Berechtigungsverwaltung für eine einzelne Route festgelegt.
Die folgende Überlegung ist, was zum Markieren von Berechtigungen verwendet werden soll. Sie können Bits, Zeichen oder ganze Zahlen verwenden. Später habe ich die Charaktere aufgrund von zwei Überlegungen ausgewählt: 1. Die Charaktere sind leicht zu verstehen und in der Datenbank leicht zu suchen. 2. Ich musste nicht nach Personen mit dieser Autorität suchen, das heißt, es gab sie Keine Rückwärtssuche erforderlich. Die Verwendung von Bits, des gesamten Typs usw. ist von geringer Bedeutung.
Als nächstes überlegen wir, wie ich es mit Laravel kombinieren kann. Da ich für jede Route Zugriffsberechtigungen festlegen muss, hoffe ich natürlich, dies in der Route.php-Routingverwaltung von Laravel zu konfigurieren. Am besten ist es, einen Parameter zum Festlegen der Berechtigung während Route::get zu haben. Dies hat den Vorteil, dass die Berechtigungseinstellung einfach ist. Bei der Entscheidung für das Routing habe ich bequem die Berechtigungskontrolle geschrieben. Der Nachteil besteht darin, dass Sie offensichtlich nur eine der drei Methoden des Laravel-Routings schreiben können. Dies ist Route::(Methode).
Sobald die Entscheidung grundsätzlich gefallen ist, kann es losgehen.
Routing-Design
Das grundlegende Routing sieht so aus
Route::post('/admin/validate', ['uses' => 'AdminController@postValidate', 'permissions'=>['admin.validate', 'admin.index']]);
Nachdem die grundlegende Routing-Aktion festgelegt wurde, wird ein Berechtigungsattribut festgelegt ein Array. Da beispielsweise eine Post-Anfrage auf einer bestimmten Seite oder auf einer anderen Seite ausgelöst werden kann, muss diese Post-Anfrage über die Routing-Berechtigungen beider Seiten verfügen.
Hier wird die Berechtigungssteuerung von admin.validate verwendet. Auf diese Weise können Berechtigungen gruppiert werden, die sich auf admin-bezogene Gruppen beziehen. In der Datenbank werde ich ein zweidimensionales Array speichern ] => ['validate', 'index']; Was ist der Vorteil der Speicherung als zweidimensionales Array statt einer Dimension? Im Allgemeinen hat die Hintergrundanzeige zwei Dimensionen, eine ist die Tab-Leiste im Kopf, und das andere ist die Navigationsleiste auf der linken Seite. Das heißt, dieses zweidimensionale Array hat eine Eins-zu-eins-Entsprechung mit den Tab- und Navigationsspalten im Hintergrund.
Middleware-Design
Okay, jetzt installieren wir die Middleware und legen alle Routen fest, um diese Middleware zu verwenden
<?php namespace App\Http\Middleware; use Illuminate\Support\Facades\Session; use Closure; class Permission { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $permits = $this->getPermission($request); $admin = \App\Http\Middleware\Authenticate::getAuthUser(); // 只要有一个有权限,就可以进入这个请求 foreach ($permits as $permit) { if ($permit == '*') { return $next($request); } if ($admin->hasPermission($permit)) { return $next($request); } } echo "没有权限,请联系管理员";exit; } // 获取当前路由需要的权限 public function getPermission($request) { $actions = $request->route()->getAction(); if (empty($actions['permissions'])) { echo "路由没有设置权限";exit; } return $actions['permissions']; } }
Das Wichtigste hier ist: Die getPermission-Funktion erhält die Aktionsdefinition dieser Route von $request->route()->getAction() und ruft dann die in route.php definierten Routing-Berechtigungen aus dem Berechtigungsfeld ab.
Dann hat die obige Middleware:
admin−>hasPermission(admin−>hasPermission(permit);
Dies beinhaltet das Design des Modells.
Modelldesign
<?php namespace App\Models\Admin; use App\Models\Model as BaseModel; class Admin extends BaseModel { protected $table = 'admin'; // 判断是否有某个权限 public function hasPermission($permission) { $permission_db = $this->permissions; if(in_array($permission, $permission_db)) { return true; } return false; } // permission 是一个二维数组 public function getPermissionsAttribute($value) { if (empty($value)) { return []; } $data = json_decode($value, true); $ret = []; foreach ($data as $key => $value) { $ret[] = $key; foreach ($value as $value2) { $ret[] = "{$key}.{$value2}"; } } return array_unique($ret); } // 全局设置permission public function setPermissionsAttribute($value) { $ret = []; foreach ($value as $item) { $keys = explode('.', $item); if (count($keys) != 2) { continue; } $ret[$keys[0]][] = $keys[1]; } $this->attributes['permissions'] = json_encode($ret); } }
In der Datenbank habe ich das zweidimensionale Array als JSON gespeichert und die Attribut-Get- und Set-Methoden von Laravel verwendet, um die Integration von JSON in die Datenbank und extern abzuschließen Programmlogik. Dann scheint hasPermission sehr einfach zu sein. Beurteilen Sie in_array einfach direkt und es wird in Ordnung sein.
Nachverfolgung
Die Logik dieser Berechtigungsauthentifizierung wird klar sein. Wenn dann eine Registerkarte oder Navigation auf der Seite Benutzern mit unterschiedlichen Berechtigungen angezeigt werden muss, müssen Sie nur
@if ($admin->hasPermission('admin.index')) @endif
in der Ansicht beurteilen, um festzustellen, ob der Benutzer die Registerkarte sehen kann.
Zusammenfassung
Dies ist eine nicht allzu komplizierte Implementierung von Benutzerberechtigungen, aber ich denke, dass sie die meisten Hintergrundanforderungen erfüllen kann. Natürlich kann es viele Punkte geben, die optimiert werden können. Wenn hasPermission beispielsweise in nosql oder pg gespeichert ist, kann eine direkte DB-Anfrage ermittelt werden ob es eine Erlaubnis oder ähnliches gibt?