Filament

Use Filament to generate the admin panel.

composer require filament/filament:"^3.0-stable" -W
php artisan filament:install --panels

User

<?php

namespace App\Models;

use Filament\Models\Contracts\FilamentUser;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements FilamentUser
{
    public function canAccessPanel(\Filament\Panel $panel): bool
    {
        return str_ends_with($this->email, '@yourdomain.com') && $this->hasVerifiedEmail();
    }
}

Default admin user

config/app.php
return [
  'admin' => [
      'email' => env('APP_ADMIN_EMAIL', 'superadmin@example.com'),
      'password' => env('APP_ADMIN_PASSWORD', 'password'),
  ],
];
.env
APP_ADMIN_EMAIL=superadmin@example.com
APP_ADMIN_PASSWORD=password

Add to seeders

cat > database/seeders/EmptySeeder.php << EOF
<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;

class EmptySeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        User::factory()->create([
            'name' => 'Super Admin',
            'email' => config('app.admin.email'),
            'password' => Hash::make(config('app.admin.password')),
        ]);
    }
}
EOF
php artisan db:seed --class=EmptySeeder
database/seeders/DatabaseSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            EmptySeeder::class
        ]);
    }
}

Update Admin panel

app/Providers/Filament/AdminPanelProvider.php
<?php

namespace App\Providers\Filament;

use Filament\Support\Colors\Color;

class AdminPanelProvider extends PanelProvider
{
    public function panel(Panel $panel): Panel
    {
        return $panel
            ->default()
            ->id('admin')
            ->path('admin')
            ->favicon(config('app.url').'/favicon.svg')
            ->login()
            ->colors([
                'primary' => Color::Purple,
            ])
            ->brandLogo(asset('favicon.svg'))
            ->brandName('Brand')
            ->brandLogoHeight('2.2rem')
            ->homeUrl('/')
            ->login(\App\Filament\Pages\Auth\LoginLogin::class) // to override default login page
            ->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
            ->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
            ->databaseNotifications()
            ->pages([
                Pages\Dashboard::class,
            ])
            ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
            ->widgets([
                Widgets\AccountWidget::class,
                Widgets\InfoWidget::class,
            ])
    }
}

Create Login page

```bash
mkdir -p app/Filament/Pages/Auth
cat > app/Filament/Pages/Auth/Login.php << EOF
<?php

namespace App\Filament\Pages\Auth;

use Filament\Pages\Auth\Login as BasePage;

class Login extends BasePage
{
    public function mount(): void
    {
        parent::mount();

        \$this->form->fill([
            'email' => config('app.admin.email'),
            'password' => config('app.admin.password'),
            'remember' => true,
        ]);
    }
}
EOF
Table of Contents