除了內建提供的認證服務外,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);
}
// 更新文章...
}
}