👨‍👩‍👦‍👦

Laravel 管理画面 FilamentにFilamentAccessControlプラグインでユーザ権限管理を追加する

YOSHIAKI KUSAKA2022/12/23に公開

💁‍♂️ はじめに

Laravel 管理画面 Filamentを速攻で動かすの続き

株式会社EGSTOCKの日下繕章です
filamentにて管理画面専用ユーザやロール権限を管理したい需要がでてきたので調査したところ
FilamentAccessControlというプラグインがイケてそうなので試してみた

https://filamentphp.com/plugins/access-control

🎯 実現できること

  • 管理画面用のユーザは専用テーブルで管理できる
  • ユーザに対してロール/権限を割り当てることができる
  • パスワードリセットを行うことができる
  • メールを利用した2段階認証の設置ができる

🔧 準備

前提としてLaravel 管理画面 Filamentを速攻で動かすの設定は適用済

1) プラグインをインストール

composer require chiiya/filament-access-control

2) guardとログインページでプラグインを利用する設定に

config/filament.php
    '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セクションが追加され権限管理が可能に

その他

日付フォーマット変更

config/filament-access-control.php
-    'date_format' => 'd.m.Y',
+    'date_format' => 'Y年m月d日',

2段階認証を有効にする

ログイン時にメール送信したコードでの2段階認証を行うようにできる

プラグイン設定ファイルを編集

config/filament-access-control.php
    'features' => [
        //        \Chiiya\FilamentAccessControl\Enumerators\Feature::ACCOUNT_EXPIRY,
-       //        \Chiiya\FilamentAccessControl\Enumerators\Feature::TWO_FACTOR,
+       \Chiiya\FilamentAccessControl\Enumerators\Feature::TWO_FACTOR,

    ],

ログイン後に2段階認証画面が表示され、メールにも認証コードが届くようになる

メールにも認証コードが届くようになる

アカウント有効期限を有効にする

アカウントに有効期限を設定できるようになる

プラグイン設定ファイルを編集

config/filament-access-control.php
    'features' => [
-        //        \Chiiya\FilamentAccessControl\Enumerators\Feature::ACCOUNT_EXPIRY,
+      \Chiiya\FilamentAccessControl\Enumerators\Feature::ACCOUNT_EXPIRY,
       //        \Chiiya\FilamentAccessControl\Enumerators\Feature::TWO_FACTOR,


    ],

filament設定ファイルを編集

config/filament.php
+ 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項目が追加され、期限切れのユーザではログインできなくなる

権限

ResourcePageAction毎に権限を設定できるようになる

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の権限設定

Actionvisible()メソッドで権限を設定

ButtonAction::make('exports')
    ->visible(fn () => Filament::auth()->user()->can('exports.view'))

日本語化

FilamentAccessControlは執筆時点(2022/12)では日本語化は対応されてない
対応が必要な場合はlang/vendor/filament-access-control配下に日本語化設定を追加

感想

FilamentAccessControlプラグインを入れるだけで権限管理に必要な機能がすぐ揃うのはかなり嬉しい
Filamentのユーザ権限を管理したい人には是非ともおすすめ

メリットとデメリットについても記載しておく

メリット

  • ロール/権限関連のテーブルが準備される
  • ロール/権限を管理する画面項目も準備される
  • パスワードリセット/ユーザ有効期間/2段階認証等の管理側的にも助かる機能がある

デメリット

  • ポリシーまわりがすんなり理解しづらい
  • 権限を適用するために多少のコーディングが必要
  • 日本語化されてない
  • 簡単なプラグインという性質上、開発が活発ではなく今後のメンテナンスが不透明
EGSTOCK,Inc.

EGSTOCK, Inc. 札幌の開発会社 FE/BEはじめNFTにも積極挑戦中 [言語]PHP/Python/Java/Vue.js/React.js [クラウド]AWS(ECS/CloudFormation), GCP(CloudRun/CloudSpanner) [その他]Docker/OpenApi

Discussion

ログインするとコメントできます