はじめに
フォームリクエストのauthorizeメソッドには「認可」の処理を実装します。
ただ、「認証」と何が違うのでしょうか?
Laravelの公式ドキュメントには、「認証」と「認可」をごちゃ混ぜにしないようにと注意書きがあります。
ガードとプロバイダを「役割」や「許可」と混同しないでください。権限を介したユーザーアクションの認可の詳細については、認可のドキュメントを参照してください。(「Laravel 8.x 認証」より)
認証(Authentication)とは
- 認証(Authentication)とは、ユーザーが誰であるかを確認するプロセスです
例えば、多くのアプリケーションにおいて、ユーザーがログインする時には登録したユーザー名とパスワードを入力します。
これらの情報が正しい(データベースに保存されている情報と一致する)時、
ユーザーは「認証」され、システムにアクセスできますね。
実際のLaravelプロジェクトでの例も見てみます。
<?php
// 中略
public function create()
{
$user = Auth::user(); // ココが認証部分
return view('sales.create', [
'user' => $user,
]);
}
?>
上記のコードのcreateメソッドでは、Auth::user()を使用して、現在認証されているユーザ(ログインユーザ)を取得しています。
これは認証の一例だと言えるでしょう。
認可(Authorization)とは
- 認可(Authorization)とは、認証されたユーザが特定のリソースにアクセスしたり、
- 特定のアクションを実行したりできるかをどうかを決定するプロセスです
例えば、特定のユーザーが特定のウェブページを表示したり、データを編集したりできるかどうかを制御します。
こちらも具体的な実装例で見てみます。
<?php
public function destroy($id)
{
$sales_order = SalesOrder::findOrFail($id);
if (Auth::id() === $sales_order->user_id) // ココが認可部分 {
$sales_order->delete();
return back()
->with('発注は削除されました');
}
return back()
->with('削除に失敗しました');
上記のコードのdestroyメソッドでは、特定のSalesOrder(発注)を削除しますが、
この削除操作は通常、そのSalesOrderの所有者もしくは管理者のみが実行できるはずです。
でなければ、悪意あるユーザが不正に発注を削除してしまう可能性があります。
そこで「認可」の出番です。
if (Auth::id() === $sales_order->user_id)
ここでは認可として、「$sales_orderに紐づいたユーザidが、現在認証されているユーザのユーザidと同じか否か」をチェックしています。
このチェックがtrueを返す場合、つまり認証されたユーザがSalesOrderの所有者である場合、
そのユーザはSalesOrderに対する特定のアクション(この場合は削除)を実行できます。
これは認可の一例です。
まとめ
認証(Authentication)
- ユーザが本当にユーザ自身であるかを確認するプロセス
- 例: システムへのログイン
認可(Authorization)
- 認証されたユーザが特定のアクションを実行したりすることを許可するプロセス
- 例: 特定のユーザが特定のデータを編集・削除する権限の有無
超ざっくり日常レベルに落とし込むと…
ネットフリックスにおいて、全ユーザはログインを求められます(認証)。
そして、スタンダードプランのユーザとプレミアムプランのユーザで、得られる恩恵は変わるはずです(認可)。
参考