Filamentで開発3(管理画面を分ける)

いくつか方法がありそう

  • 管理パネルを複数作って、Gurdなどでログインできるユーザーを制限する。
  • 管理パネルを複数作って、ログイン部分を改良して振り分ける。
  • model policyを使ってモデル単位で、ユーザーを制限する。管理パネルは一つ
  • 公式で推している?Multi-tenancy

Guardについては下記の記事がわかりやすかった

管理パネル内を分ける

admin管理パネルはそのままに、内部でadminと一般ユーザーのできることを分ける。

管理パネルの制限(企画倒れ)

以下の動画と公式ドキュメントを見ながら試してみた。

用語

調べるに当たり出てきたキーワードを挙げておく。

  • model policy
  • viewAny()

ポリシーの作成

Laravelのポリシーの機能をFilamentでも活用できるっぽい。

php artisan make:policy UserPolicy --model=User
php artisan make:policy GuildPolicy --model=Guild
php artisan make:policy RolePolicy --model=Role
php artisan make:policy PermissionPolicy --model=Permission

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

  • app\Policies\UserPolicy.php
  • app\Policies\GuildPolicy.php
  • app\Policies\RolePolicy.php
  • app\Policies\PermissionPolicy.php

ポリシーファイルの編集

4ファイルとも同様に。viewAnycreateupdatedeleteの戻り値に$user->hasRole('admin')を入れる。

    public function viewAny(User $user): bool
    {
        return $user->hasRole('admin');
    }
    //~~~~~中略~~~~~
    public function create(User $user): bool
    {
        return $user->hasRole('admin');
    }
    //~~~~~中略~~~~~
    public function update(User $user, User $model): bool
    {
        return $user->hasRole('admin');
    }
    //~~~~~中略~~~~~
    public function delete(User $user, User $model): bool
    {
        return $user->hasRole('admin');
    }

編集

//~~~~~中略~~~~~
use App\Policies\UserPolicy;
use App\Policies\GuildPolicy;
use App\Policies\RolePolicy;
use App\Policies\PermissionPolicy;

use App\Models\User;
use App\Models\Guild;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
//~~~~~中略~~~~~
    protected $policies = [
        User::class => UserPolicy::class,
        Guild::class => GuildPolicy::class,
        Role::class => RolePolicy::class,
        Permission::class => PermissionPolicy::class,
    ];
//~~~~~中略~~~~~

管理パネルを分ける(失敗)

adminと一般ユーザーのダッシュボードを分ける。

元々のダッシュボードは、app\Providers\Filament\AdminPanelProvider.phpにあるけど、これとは別に一般ユーザーがアクセスするダッシュボードを作成する。

下記の公式ページを見ながら実践してみた。

新しいパネル(ダッシュボード)の作成

パネルの生成

adminパネルとは別のパネルを生成。

php artisan make:filament-panel app

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

  • app\Providers\Filament\AppPanelProvider.php

また、以下のファイルにコードが追記される

  • config\app.php

パネルファイルの編集

ルーティングの変更

ここはchatGPTに聞きながら作成した。

Middlewareを作成する

php artisan make:middleware RedirectAfterLogin

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

  • app\Http\Middleware\RedirectAfterLogin.php

ミドルウェアファイルの編集

ユーザーに応じてリダイレクト先を設定する。

    // ~~~~~中略~~~~~
    public function handle(Request $request, Closure $next): Response
    {
        if (auth()->check()) {
            $user = auth()->user();

            // 例: ユーザーのrole属性に応じてリダイレクト先を決定
            if ($user->role == 'admin') {
                return redirect('/admin/dashboard');
            } else if ($user->role == 'user') {
                return redirect('/user/dashboard');
            }
        }
        // ~~~~~中略~~~~~
        return $next($request);
    }

ミドルウェアを組み込む

ルートに組み込む

コメントする