laravel-permissionメモ
laravel-permission について試して気づいたことのメモ
ドキュメントはこちら。README.md 中に記載がある。
https://docs.spatie.be/laravel-permission/v3/introduction/
Installation in Laravel
Installation in Laravel | laravel-permission | Spatie
こちらに従い、インストールを実施
この手順を行うと、
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
下のファイルが作成される
手順をしたときに何が起こるか書かれておらず、気になったのでメモする
2020_07_23_121339_create_permission_tables.php
2020_07_23_121339_create_permission_tables.php
は次のテーブルを作る
- permissions
- roles
- model_has_permissions
- model_has_roles
- role_has_permissions
model
がユーザーのことを意味しているようだった。
ユーザーの情報を model
という名前にしているのは、実際、ユーザーの情報を何というモデル名にしているかは、人それぞれだろうということではなかろうか。
Example App
Example App | laravel-permission | Spatie の手順からかいつまんで実施。
Add some basic permissions で super-admin のユーザーを作る部分を少しいじって、パスワードを指定するようにした。
each()
を使っている必要性はとくにない。
$role3 = Role::create(['name' => 'super-admin']); // gets all permissions via Gate::before rule; see AuthServiceProvider factory(App\User::class, 1)->create()->each(function ($user) use ($role3) { $user->name = 'admin'; $user->email = 'admin@localhost'; $user->password = Hash::make('password'); $user->save(); $user->assignRole($role3); });
Grant Super-Admin access にあるコードも加えた
ユーザーを作成しロールを与えるコード
Laravel でアプリケーション作成のときに、認証のディレクティブを加えていれば、
ユーザー作成するコードが下記にあるはず
app\Http\Controllers\Auth\RegisterController.php
protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); }
そこへ、とりあえず決め打ちで admin
ロールを与えるコードを追記した。
protected function create(array $data) { $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); $user->assignRole('admin'); return $user; }
この状態でユーザーを作成し、テーブルにどのようにレコードができるか確認したりなどした。
ロールによるルートのアクセス制限
Using a middleware | laravel-permission | Spatie を参考にルーターへアクセス制限のコードを加えて試した。
Package Middleware の手順にあるとおり、app/Http/Kernel.php
へmiddlewareを使うことを設定した。 下の方の3行が加えたもの。
/** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, // laravel-permission 'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class, 'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class, 'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class, ];
routes\web.php
へ下のような追記をした。
ロールに writer
を持つユーザーや、admin
を持つユーザーなど、ユーザーを変えて、
/writer
や /admin
へアクセスし、アクセスできたり、拒否されたりするのを確認した。
ロールが理由でアクセスできなかったとき、飛ばされるページにアクセスできなかった理由がロールだと表示される。
おそらくそのページはカスタマイズできるのだろう。カスタマイズを試してはいない。
Route::group(['middleware' => ['role:super-admin|admin|writer']], function () { Route::get('/writer', function () { return 'writer'; }); }); Route::group(['middleware' => ['role:super-admin|admin']], function () { Route::get('/admin', function () { return 'admin'; }); });
了