Laravelで爆速API開発シリーズ第四弾は「認可」です!APIを外部に公開する時、あるデータへのアクセス制御は非常に重要になってきますので、Laravelのポリシーを用いた認可の実装を紹介します。本記事はLaravelで爆速API開発シリーズ「RESTful API編」の続きなので未読の方はぜひチェックしてください!またLaravelで爆速API開発シリーズ「JWTユーザログイン編」でJWT認証についても解説しているのでぜひチェックしてください!
目次
やること
Laravelで爆速API開発シリーズ「RESTful API編」で作成したToDoにアクセス制限をつけます。
具体的にはログインユーザのみに新規作成を許可し、更新、削除に関してはToDoを作成したユーザのみに許可するようにします。
ポリシーとは
ポリシーとは特定のモデルやリソースに関する認可ロジックを系統立てるためのクラスです。たとえば、今回の場合ToDoアプリケーションの場合、Todoモデルとそれに対応する、Todoを作成、更新するなどのユーザーアクションを認可するTodoPolicyを作成します。
ポリシーの作成
さっそくArtisanコマンドを使ってポリシーを作成します。
php artisan make:policy TodoPolicy --model=Todo
app/PoliciesにTodoPolicy.phpが作成されたのを確認しましょう。
以下のようになっているはずです。
<?php
namespace App\Policies;
use App\User;
use App\Todo;
use Illuminate\Auth\Access\HandlesAuthorization;
class TodoPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view the todo.
*
* @param \App\User $user
* @param \App\Todo $todo
* @return mixed
*/
public function view(User $user, Todo $todo)
{
//
}
/**
* Determine whether the user can create todos.
*
* @param \App\User $user
* @return mixed
*/
public function create(User $user)
{
//
}
/**
* Determine whether the user can update the todo.
*
* @param \App\User $user
* @param \App\Todo $todo
* @return mixed
*/
public function update(User $user, Todo $todo)
{
//
}
/**
* Determine whether the user can delete the todo.
*
* @param \App\User $user
* @param \App\Todo $todo
* @return mixed
*/
public function delete(User $user, Todo $todo)
{
//
}
}
ポリシーの登録
AuthServiceProviderにはEloquentモデルと対応するポリシーをマップするためのpoliciesプロパティがあります。ここに先ほど作成したTodoPolicyを登録しましょう。以下のようにします。
app/Providers/AuthServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Todo' => 'App\Policies\TodoPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
//
}
}
Eloquentリレーションの定義
app/User.phpに以下を記述しましょう。
public function todos()
{
return $this->hasMany('App\Todo');
}
}
app/Todo.phpに以下を記述します。
public function user()
{
return $this->belongsTo('App\User');
}
これでUserとTodoの間に一対多の関係を定義することができました。
ポリシーの記述
TodoPolicyの記述をしましょう。
public function update(User $user, Todo $todo)
{
return $user->id === $todo->user_id;
}
public function delete(User $user, Todo $todo)
{
return $user->id === $todo->user_id;
}
書き上げたらPolicyを適用します。
TodoController.phpにconstructorを追加しましょう。
public function __construct(){
$this->middleware('jwt.auth')->only('store','update', 'destroy');
$this->middleware('can:update,todo')->only('update');
$this->middleware('can:delete,todo')->only('destroy');
}
public function store(Request $request)
{
$todo = new Todo;
$todo->title = $request->title;
$todo->status = $request->status;
$todo->memo = $request->memo;
$todo->user_id = Auth::id(); // この行を追加
$todo->save();
return $todo;
}
- todoのテーブルにuser_idのカラムを追加してください。
これで非ログインユーザは新規追加、更新、削除ができなくなり、更新、削除に関してはTodoを所有するユーザ以外はできなくなりました。
POSTMANで動作検証
例えば、以下のようにリクエストすると401 Unauthorizedとなります。
以下のようにトークンを取得しましょう。(JWTトークンに関してはLaravelで爆速API開発シリーズ「JWTユーザログイン編」を参考にしてください。)
のようにリクエストするとTodoが更新されるようになりました。
更新や削除はTodoの所有ユーザでしかできないのを確認しましょう。
いかがでしたでしょうか。LaravelのPolicyを使うことによって認可ロジックを綺麗で簡潔に表現できます。実際のアプリケーションではもう少し複雑な認可ロジックを組み立てる必要がありますが、この記事で基本をマスターして応用していきましょう!
お疲れ様です〜。
Laravelのおすすめ本紹介
Laravelで爆速API開発シリーズ以外にも、Laravelの理解を深めたい方にはこちらの本がおすすめです!
PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応
Laravelの本は数多く出版されていますが、この本が断然わかりやすいと思います!
Laravelマスターを目指すならぜひ一度ご覧になってみるといいと思います。

WINDII

最新記事 by WINDII (全て見る)
- Canvaが最高すぎる。使い方を完全ガイド【チュートリアルあり】 - 2019年5月14日
- 人気急上昇中のLaravelをはじめよう!【徹底解説】 - 2019年4月23日
- Laravelの認可を理解して実装してみよう! - 2019年3月29日
この記事へのコメントはありません。