iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 28
0
Modern Web

PHP laravel的邂逅系列 第 28

DAY28-laravel 授權介紹

  • 分享至 

  • xImage
  •  

DAY28-laravel 授權介紹

介紹

除了內建提供的認證服務外,Laravel 也提供了簡單的方式來組織認證邏輯及控制資源的存取。有很多種方法與輔助函式能幫助你組織你的授權邏輯,在本文件中我們將會涵蓋每一種方式。

定義權限

判斷一個使用者是否可以執行特定行為,最簡單的方式就是使用 Illuminate\Auth\Access\Gate 類別定義「權限」。AuthServiceProvider 是 Laravel 提供的一個方便位置,以定義你應用程式中的所有權限。舉個例子,讓我們定義一個 update-post 的權限,以取得目前的 User 及 Post 模型。在我們的權限中,我們會判斷使用者的 id 與文章的 user_id 是否相符:

<?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)
    {
        $this->registerPolicies($gate);

        $gate->define('update-post', function ($user, $post) {
            return $user->id === $post->user_id;
        });
    }
}

注意,我們並不會檢查當給定的 $user 不是 NULL。當沒有經過認證的使用者或是特定的使用者沒有透過 forUser 方法指定,那麼 Gate 會自動為所有權限回傳 false。

檢查權限

一旦權限被定義後,我們可以透過不同方式「檢查」。首先,我們可以使用 Gate facade 的 check、allows 或 denies 方法。這些所有方法會取得權限的名稱及參數,並會被傳遞至權限的回呼中。你不需要傳遞目前的使用者至該方法,因為 Gate 會自動在回呼參數的前方加上目前的使用者。所以,當透過我們前面定義的 update-post 權限進行檢查時,我們只需傳遞一個 Post 實例至 denies 方法:

<?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', $post)) {
            abort(403);
        }

        // 更新文章...
    }
}


上一篇
DAY27-laravel 認證介紹
下一篇
DAY29-laravel 交易介紹
系列文
PHP laravel的邂逅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言