laravel-permissionメモ

laravel-permission について試して気づいたことのメモ

github.com

ドキュメントはこちら。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"

下のファイルが作成される

  • config\permission.php
  • database\migrations\2020_07_23_121339_create_permission_tables.php

手順をしたときに何が起こるか書かれておらず、気になったのでメモする

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';
    });
});