Laravel 管理画面 FilamentにFilamentAccessControlプラグインでユーザ権限管理を追加する
💁♂️ はじめに
Laravel 管理画面 Filamentを速攻で動かすの続き
株式会社EGSTOCKの日下繕章です
filamentにて管理画面専用ユーザやロール権限を管理したい需要がでてきたので調査したところ
FilamentAccessControlというプラグインがイケてそうなので試してみた
🎯 実現できること
- 管理画面用のユーザは専用テーブルで管理できる
- ユーザに対してロール/権限を割り当てることができる
- パスワードリセットを行うことができる
- メールを利用した2段階認証の設置ができる
🔧 準備
前提としてLaravel 管理画面 Filamentを速攻で動かすの設定は適用済
1) プラグインをインストール
composer require chiiya/filament-access-control
2) guardとログインページでプラグインを利用する設定に
'auth' => [
- 'guard' => env('FILAMENT_AUTH_GUARD', 'web'),
+ 'guard' => env('FILAMENT_AUTH_GUARD', 'filament'),
'pages' => [
- 'login' => \Filament\Http\Livewire\Auth\Login::class,
+ 'login' => \Chiiya\FilamentAccessControl\Http\Livewire\Login::class,
],
],
3) プラグインのマイグレーション・設定ファイルを公開
php artisan vendor:publish --tag="filament-access-control-migrations"
php artisan vendor:publish --tag="filament-access-control-config"
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate
4) 権限まわりの初期データを登録
php artisan filament-access-control:install
5) 管理ユーザを作成
# php artisan filament-access-control:user
First Name:
> [任意の値]
Last Name:
> [任意の値]
Email address:
> [メールアドレス]
Password:
> [パスワード]
Success! [メールアドレス] may now log in at http://localhost/admin/login.
6) 管理ユーザでログイン
ログイン画面にはパスワードリセットへのリンクが追加されパスワードリセットが可能に
ダッシュボードにはADMINISTRATION
セクションが追加され権限管理が可能に
その他
日付フォーマット変更
- 'date_format' => 'd.m.Y',
+ 'date_format' => 'Y年m月d日',
2段階認証を有効にする
ログイン時にメール送信したコードでの2段階認証を行うようにできる
プラグイン設定ファイルを編集
'features' => [
// \Chiiya\FilamentAccessControl\Enumerators\Feature::ACCOUNT_EXPIRY,
- // \Chiiya\FilamentAccessControl\Enumerators\Feature::TWO_FACTOR,
+ \Chiiya\FilamentAccessControl\Enumerators\Feature::TWO_FACTOR,
],
ログイン後に2段階認証画面が表示され、メールにも認証コードが届くようになる
メールにも認証コードが届くようになる
アカウント有効期限を有効にする
アカウントに有効期限を設定できるようになる
プラグイン設定ファイルを編集
'features' => [
- // \Chiiya\FilamentAccessControl\Enumerators\Feature::ACCOUNT_EXPIRY,
+ \Chiiya\FilamentAccessControl\Enumerators\Feature::ACCOUNT_EXPIRY,
// \Chiiya\FilamentAccessControl\Enumerators\Feature::TWO_FACTOR,
],
filament設定ファイルを編集
+ use Chiiya\FilamentAccessControl\Http\Middleware\EnsureAccountIsNotExpired;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\DispatchServingFilamentEvent;
use Filament\Http\Middleware\MirrorConfigToSubpackages;
・
・
'middleware' => [
'auth' => [
Authenticate::class,
+ EnsureAccountIsNotExpired::class,
],
・
・
Admin Users
の編集画面にExpiry Date
項目が追加され、期限切れのユーザではログインできなくなる
権限
Resource
、Page
、Action
毎に権限を設定できるようになる
Resourceの権限設定
ポリシーを作成し権限を設定
class ProductPolicy
{
public function viewAny(FilamentUser $user): bool
{
return $user->can('products.view');
}
// ...
}
Pageの権限設定
AuthorizesPageAccess
トレイトを使用して権限を設定
use Chiiya\FilamentAccessControl\Traits\AuthorizesPageAccess;
class MyPage extends Page
{
use AuthorizesPageAccess;
public static string $permission = 'my-page.view';
public function mount(): void
{
static::authorizePageAccess();
}
}
Actionの権限設定
Action
のvisible()
メソッドで権限を設定
ButtonAction::make('exports')
->visible(fn () => Filament::auth()->user()->can('exports.view'))
日本語化
FilamentAccessControlは執筆時点(2022/12)では日本語化は対応されてない
対応が必要な場合はlang/vendor/filament-access-control
配下に日本語化設定を追加
感想
FilamentAccessControlプラグインを入れるだけで権限管理に必要な機能がすぐ揃うのはかなり嬉しい
Filamentのユーザ権限を管理したい人には是非ともおすすめ
メリットとデメリットについても記載しておく
メリット
- ロール/権限関連のテーブルが準備される
- ロール/権限を管理する画面項目も準備される
- パスワードリセット/ユーザ有効期間/2段階認証等の管理側的にも助かる機能がある
デメリット
- ポリシーまわりがすんなり理解しづらい
- 権限を適用するために多少のコーディングが必要
- 日本語化されてない
- 簡単なプラグインという性質上、開発が活発ではなく今後のメンテナンスが不透明
Discussion