Laravel Permissionを使おう②実践編 インストール〜アクセス制御

こんにちは。前回に続いてLaravel Permissionの解説をしていきます。今回はLaravel Permissionのインストールと基本的な使い方をマスターできる内容になっております。

Laravel Permissonのインストール

まずはLaravel Permissionをcomposer requireでインストールします。

$ composer require spatie/laravel-permission

config/app.phpにLaravel Permissionを登録します。

'providers' => [
    // ...
    Spatie\Permission\PermissionServiceProvider::class,
];

artisan vendor:publishを実行し、設定ファイル(config/permission.php)と、マイグレーションが作成されます。

$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

以下のファイルが作られる
・/config/permission.php
・/database/migrations/yyyy_mm_dd_hhmmss_create_permission_tables.php

マイグレーションを実行して必要なテーブルを作成します。

$php artisan migrate

以上でLaravel Permissionのインストールは完了です。

ユーザーにアクセス権を設定する

次にユーザーにアクセス権を設定していきます。先程マイグレーションで作成されたテーブルにデータを登録していく作業となります。データの登録にはseederを使用します。

今回設定する権限

まずは今回設定するアクセス権の構造を解説します。まずは以下の図を確認ください。

まずはロールです。今回は管理者(admin)と一般ユーザー(general)を作ります。adminは機能Aに対するアクセス権を持ち、generalは機能Bに対するアクセス権を持ちます。user1にはadminとgeneralを割り当て、user2にはgeneralを割り当てます。最終的にuser1は機能Aと機能B、user2には機能Bのアクセス権が割り当てられることになります。

ユーザーモデルにHasRolesトレイトを組み込む

アクセス権を設定する前に、UserモデルにHasRolesトレイトを組み込みます。このトレイトを組み込むことでユーザーにロールを割り当てたり、ユーザーに割り当てられている権限を取得したりできるようになります。

use Spatie\Permission\Traits\HasRoles;

class User extends Model
{
    use HasRoles;
}

アクセス権を登録する

アクセス権を登録していきましょう。今回はデータの登録にseederを使用しますので、artisan make:seederでseederを作成します。

php artisan make:seeder PermissionSeeder

作成したseederの中身を描いていきましょう。

public function run()
{
    // Permission作成
		$accessToA = Permission::create(['name' => 'access to A']);
		$accessToB = Permission::create(['name' => 'access to B']);

		// Role作成
		$admin = Role::create(['name' => 'admin']);
		$general = Role::create(['name' => 'general']);

		// PermissionとRoleを関連付け
		$admin->givePermissionTo($accessToA);
		$general->givePermissionTo($accessToB);

		// User作成
		$user1 = new User();
		$user1->name = 'user_1';
		$user1->email = 'user1@example.com';
		$user1->password = 'xxxxxx';
		$user1->save();

		$user2 = new User();
		$user2->name = 'user_2';
		$user2->email = 'user2@example.com';
		$user2->password = 'xxxxxx';
		$user2->save();

		// UserにRoleを割り当て
		$user1->assignRole('admin');
		$user2->assignRole(['admin', 'general']);

		// UserのPermissionsを表示します。
		echo $user1->getAllPermissions()->pluck('name');
		// ["access to A"]と表示

		echo $user2->getAllPermissions()->pluck('name');
		// ["access to A", "access to B"]と表示
}

Permission、Role、Userを作成し、それぞれを関連付けしています。RoleとPermissionを関連付けするにはrole->givePermissionToメソッドを使用し、ユーザーにロールを割り当てるにはuser->assignRoleメソッドを使用します。

以上でアクセス権の設定は完了です。Laravel Permissionのクラスはオブジェクト指向で設計されているのでメソッド名がわかりやすいですね。

Webページ側でアクセス制御を行う

Webページ側にアクセス制御のコードを記述しましょう。bladeに@canディレクティブを記述するだけで、アクセス制御が可能です。

@can('access to A')
  // access to Aの権限を持つユーザーの場合は描画されます。
@endcan

まとめ

Laravel Permissionのインストール、基本的な使い方を説明しました。かなり少ない手順でRBAC方式のアクセス制御を実現できました。今回はseederで作成しましたが、専用のメンテナンス画面を作ると様々なアプリケーションで使い回せるようになりそうです。

まだまだ多くの機能があるので紹介していけたら良いと思います。

Laravel

Posted by kobainmac