要するに、認証と認可は別物だよって話。
ざっくりとまとめると。
認証 Authentication あなたは誰ですか 私は X というユーザです、パスワードはこれです 確認しました X で間違いないです
認可 Authorization X です、管理画面を開きたいです あなたは管理画面への"鍵"をもっていません、拒否します
もうちょい例。 世帯主じゃなくても、家の鍵を持っていれば家に入れる。=認可 世帯主かどうかは公的文書(住民票とか)で確認する。=認証
で、じゃあ Web ではどうやんねん、というと、 (例によってよく使うものだけ紹介)
CakePHP ならこのあたりにまとまってる。
Laravel だと分かれてる。使う仕組みが違うので別項目になってるって。
Authentication - Laravel - The PHP Framework For Web Artisans Authorization - Laravel - The PHP Framework For Web Artisans
Laravel の Gate の説明をちゃんと見てみたの初めてだけど Gate かっちょいいな、権限管理とか、できるできないみたいな話がわりかし簡単にかけそう。
できるできないはこういう風に AuthServiceProvider->boot に書いたり。
Gate::define('update-post' function ($user $post) {
return $user->id == $post->user_id;
});
こういう形で クラス名 @ メソッド名 として外だししたり。
Gate::define('update-post' 'PostPolicy@update');
class PostPolicy
{
public function update(User $user Post $post)
{
return $user->id == $post->user_id;
}
}
でもって、定義した Gate は、コントローラーだったりモデルだったりで、こうやって使えるらしい。
if (Gate::forUser($user)->allows('update-post' $post)) {
// The user can update the post...
}
あとは、ポリシーを定義することができて(↑にある PostPolicy@update という書き方で使えるものとは異なる) Eloquant に対して view/create/update/delete がそれぞれ権限ありますか?というのをお手軽に内部でつないでくれるらしい。
たぶん実際のユースケース的にはいろいろ分割しやすいこの書き方がいいんじゃなかろうか。
AuthServiceProvider はこういう感じで
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Post::class => PostPolicy::class,
];
...
ポリシークラスのほうはこんな感じ。
namespace App\Policies;
use App\User;
use App\Post;
class PostPolicy
{
public function update(User $user Post $post)
{
return $user->id === $post->user_id;
}
}
さっきの update とまったく同じなんだけど、こうすることで AuthServiceProvider が勝手に Post を監視してくれて PostPolicy に書かれている通り update 時のチェックを実行して true なら update ができる、というようなことをやってくれるんだそうだ。
便利~~~~。
例えば wordpress 的なものをイメージして、簡単にやってみると。
- 投稿
- 管理者でログインしていれば投稿の作成、編集、閲覧、公開設定にすることが可能
- 編集者でログインしていれば投稿の作成、編集、閲覧、が可能。公開設定にはできない
- ログインしていなければ投稿の閲覧が可能
- コメント
- 管理者でログインしていればコメントの作成、削除、公開されたコメントの閲覧、管理者向けコメントの閲覧が可能
- それ以外は作成と、公開されたコメントの閲覧のみ可能
みたいなのも Gate をつかったらぱっぱっぱ~~~ってかけそうだって思った。 投稿ポリシーとコメントポリシーを、それぞれ書いてある通りに定義すればいいだけだし、仕様を形にするのが簡単そうだ。
んん~~~、使いどころがあれば使いたいなあ。