旗下导航:搜·么
当前位置:网站首页 > PHP框架 > Laravel > 正文

Laravel 5.1框架中的ACL用户受权和权限搜检功用的完成【laravel框架】

作者:搜搜PHP网发布时间:2019-11-27分类:Laravel浏览:105


导读:本篇文章给人人分享的内容是关于Laravel5.1框架中的ACL用户受权及权限搜检功用的完成,有肯定的参考价值,愿望能够协助到有须要的朋侪。1、弁言Laravel供应...
本篇文章给人人分享的内容是关于Laravel 5.1框架中的ACL用户受权及权限搜检功用的完成,有肯定的参考价值,愿望能够协助到有须要的朋侪。

1、弁言

Laravel供应的开箱即用的认证功用使得用户注册、登录、退出和暗码重置变得便利和简朴。

然则假如你须要掌握接见站点特定部份,或许让非治理员翻开/封闭特定页面,又或许确保某些用户只能编辑本身宣布的东西(如文章),那末 你就须要引入相似BeatSwitch Lock如许的东西或许本身手动编写如许的功用。我们将如许的功用称之为ACL:Access Control Lists(接见掌握列表),用于定义用户基于其用户纪录属性操纵或检察特定事物的权限。

荣幸的是,从Laravel 5.1.11最先,Laravel供应了开箱即用的受权功用用于完成上述需求,我们不再须要做任何分外事情,用就是了。

注:在最先本节之前,请参考升级指南将Laravel升级到Laravel 5.1.11,不然不能完成相干功用。

2、能做什么?

Laravel供应的开箱即用的ACL被称作Gate(这并非一个相似Spark的产品称号,而只是一个类和门面的称号)。

运用Gate类(注入或运用Gate门面)许可我们轻松搜检某个用户(当前登录用户或指定用户)是不是许可操纵特定事物。搜检代码以下:

if (Gate::denies('update-post', $post)) {
    abort(403);
}

将这段代码放到掌握器中,它将会运用定义好的划定规矩update-post来搜检当前认证用户是不是有权限更新指定文章。

你还能够运用Gate::allows,该要领与denies要领相对,还能够在Blade视图模板中经由过程@can来运用,另有更多更多,让我们接下来一窥终究。

3、怎样运用?

Laravel ACL建立在“权限”观点之上,权限包含一个键(比方update-post)和一个返回true或false的闭包(可传入参数)。

3.1 定义权限

让我们在AuthServiceProvider中定义用户更新文章权限update-post以下:

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

正如你所看到的,定义权限闭包的第一个参数是指定用户,假如当前用户没有经由过程登录认证,Gate将会自定返回false。

固然,除了闭包以外,还能够经由过程类要领作为第二个参数来替换闭包,该类会在容器中剖析:

$gate->define('update-post', 'PostPolicy@update');

3.2 经由过程Gate门面搜检权限

Gate供应以下要领举行权限搜检:check、allows和denies,check和allows功用用法完整一样,而denies和allows功用相反。

假如你运用门面搜检权限,则不须要通报用户实例,Gate门面会自动将当前用户通报进来:

if (Gate::denies('update-post', $post)) {       
    abort(403);
}

假如你在权限中定义了多个参数:

Gate::define('delete-comment', function ($user, $post, $comment) {
    //
});

则搜检要领以下:

if (Gate::allows('delete-comment', [$post, $comment])) {
    //
}

假如你想搜检非当前认证用户是不是有权限操纵,挪用要领以下:

if (Gate::forUser($user)->allows('update-post', $post)) {
    //
}

3.3 运用Gate注入搜检权限

和以往一样,能够注入Gate类而不是运用其门面,注入的类和你在AuthServiceProvider中一样——Illuminate\Contracts\Auth\Access\Gate:

public function somethingResolvedFromContainer(Gate $gate)
{
    if ($gate->denies('update-post')) {
        // etc.
    }
}

3.4 运用User模子搜检权限

Laravel的App\User模子如今运用了Authorizabletrait,因而能够运用其供应的can和cannot要领,离别对应Gate的allows和denies要领。

所以我们也能够运用User模子来搜检权限:

public function update(Request $request, $id)
{
    $post = Post::findOrFail($id);
    if ($request->user()->cannot('update-post', $post)) {
        abort(403);
    }
    // 更新文章...
}

3.5 在Blade中搜检权限

你能够在Blade中运用@can指令来搜检权限:

<a href="/post/{{ $post->id }}">检察文章</a>
@can('update-post', $post)
    <a href="/post/{{ $post->id }}/edit">编辑文章</a>
@endcan

与之相对的是@else指令:

@can('update-post', $post)
    <!-- The Current User Can Update The Post -->
@else
    <!-- The Current User Can't Update The Post -->
@endcan

3.6 中断权限搜检

假如是治理员或超等用户具有一切权限怎么做?或许你想要为用户暂时切换ACL逻辑又应当怎样?

Gate供应的before要领许可你在一些特定状况下在实行其他搜检前就返回,不再往下搜检权限:

$gate->before(function ($user, $ability) {
    if ($user->last_name === 'Stauffer') {
        return true;
    }
});

或许运用用户本身的时刻:

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

3.7 战略类

跟着运用逻辑愈来愈庞杂,要处置惩罚的权限愈来愈多,将一切权限定义在AuthServiceProvider明显不是一个明智的做法,因而Laravel引入了战略类,战略类是一些原生的PHP类,和掌握器基于资本对路由举行分组相似,战略类基于资本对权限举行分组治理。

生成战略类

能够运用以下Artisan敕令生成PostPolicy战略类:

php artisan make:policy PostPolicy

生成的战略类位于app/Policies目次。

然后我们能够在AuthServiceProvider的policies属性中注册战略类:

protected $policies = [
    Post::class => PostPolicy::class,
];

下面我们编辑PostPolicy以下:

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

注:一切战略类都经由过程效劳容器举行剖析,这意味着你能够在战略类的组织函数中范例提醒任何依靠,它们将会自动被注入。

搜检战略

假如为某个资本范例定义了战略类,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掌握台敕令

相干课程引荐:

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

以上就是Laravel 5.1框架中的ACL用户受权和权限搜检功用的完成的细致内容,更多请关注ki4网别的相干文章!

标签:ACL用户授权和权限检查功能