いくつか方法がありそう
- 管理パネルを複数作って、Gurdなどでログインできるユーザーを制限する。
- 管理パネルを複数作って、ログイン部分を改良して振り分ける。
- model policyを使ってモデル単位で、ユーザーを制限する。管理パネルは一つ
- 公式で推している?Multi-tenancy
Guardについては下記の記事がわかりやすかった
管理パネル内を分ける
admin管理パネルはそのままに、内部でadminと一般ユーザーのできることを分ける。
管理パネルの制限(企画倒れ)
以下の動画と公式ドキュメントを見ながら試してみた。
- Laravel Filament Roles and Permissions Full Tutorial
- https://filamentphp.com/docs/3.x/panels/resources/getting-started
用語
調べるに当たり出てきたキーワードを挙げておく。
- 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ファイルとも同様に。viewAny、create、update、deleteの戻り値に$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);
}ミドルウェアを組み込む
ルートに組み込む