Heim > PHP-Framework > Laravel > Hauptteil

Implementierung von ACL-Benutzerautorisierungs- und Berechtigungsprüfungsfunktionen im Laravel 5.1-Framework

不言
Freigeben: 2018-07-31 11:48:45
Original
2326 Leute haben es durchsucht

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);
}
Nach dem Login kopieren

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(&#39;update-post&#39;, function ($user, $post) {
            return $user->id === $post->user_id;
        });
    }
}
Nach dem Login kopieren

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(&#39;update-post&#39;, $post)) {       
    abort(403);
}
Nach dem Login kopieren

Wenn Sie mehrere Parameter in der definieren Berechtigungen:

Gate::define(&#39;delete-comment&#39;, function ($user, $post, $comment) {
    //
});
Nach dem Login kopieren

Die Prüfmethode lautet wie folgt:

if (Gate::allows(&#39;delete-comment&#39;, [$post, $comment])) {
    //
}
Nach dem Login kopieren

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(&#39;update-post&#39;, $post)) {
    //
}
Nach dem Login kopieren

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(&#39;update-post&#39;)) {
        // etc.
    }
}
Nach dem Login kopieren

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(&#39;update-post&#39;, $post)) {
        abort(403);
    }
    // 更新文章...
}
Nach dem Login kopieren

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(&#39;update-post&#39;, $post)
    <a href="/post/{{ $post->id }}/edit">编辑文章</a>
@endcan
Nach dem Login kopieren

Das Gegenteil ist der @else-Befehl:

@can(&#39;update-post&#39;, $post)
    <!-- The Current User Can Update The Post -->
@else
    <!-- The Current User Can&#39;t Update The Post -->
@endcan
Nach dem Login kopieren

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 === &#39;Stauffer&#39;) {
        return true;
    }
});
Nach dem Login kopieren

oder bei Verwendung der eigenen des Benutzers:

$gate->before(function ($user, $ability) {
    if ($user->isOwner()) {
        return true;
    }
});
Nach dem Login kopieren

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
Nach dem Login kopieren

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,
];
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

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(&#39;update&#39;, $post)) {
            abort(403);
        }
        // 更新文章...
    }
}
Nach dem Login kopieren

当然也可以使用User模型和Blade指令检查权限。

此外,Laravel还提供了一个全局帮助函数policy来检查权限:

if (policy($post)->update($user, $post)) {
    //
}
Nach dem Login kopieren

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(&#39;update&#39;, $post);
        // 更新文章...
    }
}
Nach dem Login kopieren

和我们上面的例子一样,如果授权失败会抛出403错误。

最后,如果你的控制器方法名和策略类中的方法名相同,例如都是update,则可以省略authorize的第一个参数:

public function update($id){
    $post = Post::findOrFail($id);
    $this->authorize($post);
    // 更新文章...
}
Nach dem Login kopieren

此外,AuthorizesRequests也提供了对非当前认证用户权限检查的支持:

$this->authorizeForUser($user, &#39;update&#39;, $post);
Nach dem Login kopieren

相关文章推荐:

Laravel 5.1框架中如何创建自定义Artisan控制台命令

相关课程推荐:

2017年最新的五个Laravel视频教程推荐

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!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!