Der Inhalt dieses Artikels befasst sich mit der Implementierung der ACL-Benutzerautorisierungs- und Berechtigungsprüfungsfunktionen im Laravel 5.1-Framework. Er hat einen gewissen Referenzwert und ich hoffe, dass er Freunden in Not helfen kann.
1. Einführung
Die von Laravel bereitgestellte sofort einsatzbereite Authentifizierungsfunktion macht die Benutzerregistrierung, Anmeldung, Abmeldung und das Zurücksetzen des Passworts bequem und einfach.
Aber wenn Sie den Zugriff auf bestimmte Teile der Website kontrollieren oder Nicht-Administratoren das Öffnen/Schließen bestimmter Seiten gestatten müssen oder sicherstellen müssen, dass bestimmte Benutzer nur Dinge bearbeiten können, die sie veröffentlichen (z. B. Artikel), dann Sie müssen ein Tool wie BeatSwitch Lock einführen oder eine solche Funktion manuell selbst schreiben. Wir nennen eine solche Funktion ACL: Zugriffskontrolllisten, die verwendet werden, um die Berechtigungen eines Benutzers zum Bedienen oder Anzeigen bestimmter Dinge basierend auf seinen Benutzerdatensatzattributen zu definieren.
Glücklicherweise bietet Laravel ab Laravel 5.1.11 sofort einsatzbereite Autorisierungsfunktionen, um die oben genannten Anforderungen zu erfüllen. Wir müssen keine zusätzliche Arbeit mehr leisten, sondern können sie einfach verwenden.
Hinweis: Bevor Sie mit diesem Abschnitt beginnen, lesen Sie bitte die Upgrade-Anleitung zum Upgrade von Laravel auf Laravel 5.1.11, da sonst verwandte Funktionen nicht implementiert werden.
2. Was kann getan werden?
Die von Laravel bereitgestellte sofort einsatzbereite ACL heißt Gate (dies ist kein Produktname wie Spark, sondern nur der Name einer Klasse und Fassade).
Durch die Verwendung der Gate-Klasse (Injektion oder Verwendung der Gate-Fassade) können wir einfach überprüfen, ob ein bestimmter Benutzer (aktuell angemeldeter Benutzer oder angegebener Benutzer) bestimmte Dinge bedienen darf. Der Prüfcode lautet wie folgt:
if (Gate::denies('update-post', $post)) { abort(403); }
Fügen Sie diesen Code in den Controller ein. Er verwendet die definierte Regel update-post, um zu prüfen, ob der aktuell authentifizierte Benutzer die Berechtigung zum Aktualisieren des angegebenen Artikels hat.
Sie können auch Gate::allows verwenden, was das Gegenteil der Denies-Methode ist, und auch über @can in der Blade-Ansichtsvorlage verwendet werden kann, und es gibt noch viele weitere, werfen wir als nächstes einen Blick darauf.
3. Wie benutzt man?
Laravel ACL basiert auf dem Konzept der „Berechtigungen“. Berechtigungen umfassen einen Schlüssel (z. B. update-post) und einen Abschluss, der „true“ oder „false“ zurückgibt (Parameter können übergeben werden).
3.1 Berechtigungen definieren
Lassen Sie uns die Benutzer-Update-Post-Berechtigung update-post in AuthServiceProvider wie folgt definieren:
<?php namespace App\Providers; use Illuminate\Contracts\Auth\Access\Gate as GateContract; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider{ /** * 注册应用所有的认证/授权服务. * * @param \Illuminate\Contracts\Auth\Access\Gate $gate * @return void */ public function boot(GateContract $gate) { parent::registerPolicies($gate); $gate->define('update-post', function ($user, $post) { return $user->id === $post->user_id; }); } }
Wie Sie sehen können, The Der erste Parameter, der den Berechtigungsabschluss definiert, ist der angegebene Benutzer. Wenn der aktuelle Benutzer die Anmeldeauthentifizierung nicht besteht, gibt Gate selbst „false“ zurück.
Natürlich können Sie neben Abschlüssen auch Abschlüsse durch Klassenmethoden als zweiten Parameter ersetzen, die im Container geparst werden:
$gate->define( 'update -post', 'PostPolicy@update');
3.2 Berechtigungen über die Gate-Fassade prüfen
Gate bietet die folgenden Methoden zum Überprüfen von Berechtigungen: check, The Die Funktionen von „Zulassen“ und „Verweigern“, „Prüfen“ und „Zulassen“ sind genau gleich, während die Funktionen von „Verweigern“ und „Zulassen“ gegensätzlich sind.
Wenn Sie das Gate zum Überprüfen von Berechtigungen verwenden, müssen Sie die Benutzerinstanz nicht übergeben, die Gate-Fassade übergibt automatisch den aktuellen Benutzer:
if (Gate::denies('update-post', $post)) { abort(403); }
Wenn Sie mehrere Parameter in der definieren Berechtigungen:
Gate::define('delete-comment', function ($user, $post, $comment) { // });
Die Prüfmethode lautet wie folgt:
if (Gate::allows('delete-comment', [$post, $comment])) { // }
Wenn Sie überprüfen möchten, ob der derzeit nicht authentifizierte Benutzer über die Berechtigung zum Betrieb verfügt, lautet die Aufrufmethode wie folgt:
if (Gate::forUser($user)->allows('update-post', $post)) { // }
3.3 Verwenden Sie die Gate-Injektion, um Berechtigungen zu überprüfen
Wie immer können Sie die Gate-Klasse injizieren, anstatt ihre Fassade zu verwenden. Die injizierte Klasse ist dieselbe wie im AuthServiceProvider -. IlluminateContractsAuthAccessGate:
public function somethingResolvedFromContainer(Gate $gate) { if ($gate->denies('update-post')) { // etc. } }
3.4 Verwenden des Benutzermodells Berechtigungen prüfen
Das AppUser-Modell von Laravel verwendet jetzt das Authorizabletrait, sodass Sie die bereitgestellten Can- und Can-Can-Methoden verwenden können, die übereinstimmen zu den Zulassungs- bzw. Ablehnungsmethoden des Gates.
Wir können also auch das Benutzermodell verwenden, um Berechtigungen zu überprüfen:
public function update(Request $request, $id) { $post = Post::findOrFail($id); if ($request->user()->cannot('update-post', $post)) { abort(403); } // 更新文章... }
3.5 Berechtigungen in Blade prüfen
Sie können @can im Blade-Befehl verwenden, um Berechtigungen prüfen:
<a href="/post/{{ $post->id }}">查看文章</a> @can('update-post', $post) <a href="/post/{{ $post->id }}/edit">编辑文章</a> @endcan
Das Gegenteil ist der @else-Befehl:
@can('update-post', $post) <!-- The Current User Can Update The Post --> @else <!-- The Current User Can't Update The Post --> @endcan
3.6 Berechtigungsprüfung abbrechen
Wenn Sie Administrator oder Super sind. Was sollte Tue ich das, wenn der Benutzer alle Berechtigungen hat? Oder was ist, wenn Sie die ACL-Logik für Benutzer vorübergehend ändern möchten?
Mit der von Gate bereitgestellten Vorher-Methode können Sie unter bestimmten Umständen vor der Durchführung anderer Prüfungen ohne weitere Prüfberechtigungen zurückkehren:
$gate->before(function ($user, $ability) { if ($user->last_name === 'Stauffer') { return true; } });
oder bei Verwendung der eigenen des Benutzers:
$gate->before(function ($user, $ability) { if ($user->isOwner()) { return true; } });
3.7 Richtlinienklasse
Da die Anwendungslogik immer komplexer wird und immer mehr Berechtigungen verarbeitet werden müssen, ist es offensichtlich keine kluge Idee, alle Berechtigungen in AuthServiceProvider zu definieren. Von Laravel eingeführte Strategieklassen sind einige native PHP-Klassen. Ähnlich wie Controller Routen basierend auf Ressourcen verwalten, verwalten Strategieklassen Berechtigungen in Gruppen basierend auf Ressourcen.
Richtlinienklasse generieren
Sie können den folgenden Artisan-Befehl verwenden, um die PostPolicy-Richtlinienklasse zu generieren:
php artisan make:policy PostPolicy
Die generierte Richtlinienklasse befindet sich im Verzeichnis app/Policies.
Dann können wir die Richtlinienklasse im Richtlinienattribut von AuthServiceProvider registrieren:
protected $policies = [ Post::class => PostPolicy::class, ];
Nachfolgend bearbeiten wir die PostPolicy wie folgt:
<?php namespace App\Policies; use App\User; use App\Post; class PostPolicy{ /** * 判断给定文章是否可以被给定用户更新 * * @param \App\User $user * @param \App\Post $post * @return bool */ public function update(User $user, Post $post) { return $user->id === $post->user_id; } }
Hinweis: Alle Richtlinienklassen werden durchgeparst den Service-Container, was bedeutet, dass Sie alle Abhängigkeiten im Konstruktor Ihrer Strategieklasse eingeben können und diese automatisch eingefügt werden.
Strategie prüfen
如果为某个资源类型定义了策略类,Gate将会使用第一个参数来判断检查策略类上的哪个方法。
因此,要检查是否有权限更新某篇文章,只需要传入文章实例和update权限:
<?php namespace App\Http\Controllers; use Gate; use App\User; use App\Post; use App\Http\Controllers\Controller; class PostController extends Controller{ /** * 更新给定文章 * * @param int $id * @return Response */ public function update($id) { $post = Post::findOrFail($id); if (Gate::denies('update', $post)) { abort(403); } // 更新文章... } }
当然也可以使用User模型和Blade指令检查权限。
此外,Laravel还提供了一个全局帮助函数policy来检查权限:
if (policy($post)->update($user, $post)) { // }
3.8 控制器授权
由于大多数授权都会在检查权限失败的情况下退出控制器方法,因此在控制器中检查权限有一条捷径(AuthorizesRequeststrait提供,该trait在基类控制器Controller中被使用):
<?php namespace App\Http\Controllers; use App\Post; use App\Http\Controllers\Controller; class PostController extends Controller{ /** * 更新给定文章 * * @param int $id * @return Response */ public function update($id) { $post = Post::findOrFail($id); $this->authorize('update', $post); // 更新文章... } }
和我们上面的例子一样,如果授权失败会抛出403错误。
最后,如果你的控制器方法名和策略类中的方法名相同,例如都是update,则可以省略authorize的第一个参数:
public function update($id){ $post = Post::findOrFail($id); $this->authorize($post); // 更新文章... }
此外,AuthorizesRequests也提供了对非当前认证用户权限检查的支持:
$this->authorizeForUser($user, 'update', $post);
相关文章推荐:
Laravel 5.1框架中如何创建自定义Artisan控制台命令
相关课程推荐:
Das obige ist der detaillierte Inhalt vonImplementierung von ACL-Benutzerautorisierungs- und Berechtigungsprüfungsfunktionen im Laravel 5.1-Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!