chiiya/filament-access-control
Installation
composer require chiiya/filament-access-control
php artisan vendor:publish --provider="Chiiya\FilamentAccessControl\FilamentAccessControlServiceProvider"
php artisan migrate
config/filament-access-control.php) and migrations.Register Resources
Add to app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->default()
->id('admin')
->path('admin')
->middleware([
'auth',
'verified',
'password.confirmed',
])
->registration()
->discoverResources(in: app_path('Filament/Resources'), for: 'Chiiya\FilamentAccessControl\Http\Resources')
->discoverPages(in: app_path('Filament/Pages'), for: 'Chiiya\FilamentAccessControl\Http\Pages');
}
First Use Case
/admin to see pre-built Admin Users, Roles, and Permissions CRUD resources.php artisan filament-access-control:create-super-admin --email=admin@example.com
Admin User Management
use Chiiya\FilamentAccessControl\Models\AdminUser;
$admin = AdminUser::create([
'email' => 'user@example.com',
'name' => 'Test Admin',
'role_id' => 1, // Optional: Assign role
]);
// User will receive a password reset email (no password set initially).
AdminUser::sendPasswordResetLink() or leverage Filament’s built-in password reset.Role & Permission Assignment
AdminUser model:
$admin->givePermissionTo('edit-posts');
Role model:
use Spatie\Permission\Models\Role;
$role = Role::find(1);
$role->givePermissionTo(['edit-posts', 'delete-posts']);
$admin->assignRole($role);
use Chiiya\FilamentAccessControl\Policies\AdminUserPolicy;
class PostPolicy extends AdminUserPolicy
{
public function edit(AdminUser $user, Post $post)
{
return $user->hasPermissionTo('edit-posts');
}
}
Resource Customization
php artisan vendor:publish --tag="filament-access-control-resources"
app/Filament/Resources/AdminUserResource.php:
public static function table(Table $table): Table
{
return $table
->columns([
// Custom columns...
Columns\TextColumn::make('last_login')
->dateTime('d/m/Y H:i')
->sortable(),
]);
}
Guard & Authentication
admin guard in Filament:
public function panel(Panel $panel): Panel
{
return $panel
->authGuard('admin') // Use admin guard
->discoverResources(...);
}
Route::middleware(['auth:admin'])->group(function () {
// Admin-only routes
});
Localization
resources/lang/{locale}/filament-access-control.php:
return [
'admin_user' => [
'resources' => [
'singular' => 'Administrator',
'plural' => 'Administrators',
],
],
];
Guard Misconfiguration
authGuard('admin') in AdminPanelProvider causes login failures.->authGuard('admin')
->authMiddleware(['web', 'auth:admin'])
Permission Caching
Spatie\Permission\Permission::cacheResolved();
Password Reset Edge Cases
$admin->sendPasswordResetNotification();
Role-Only vs. Permission-Only Conflicts
$admin->assignRole('editor'); // Broad access
$admin->givePermissionTo('publish-posts'); // Exception
Resource Override Pitfalls
class CustomAdminUserResource extends \Chiiya\FilamentAccessControl\Http\Resources\AdminUserResource
Check Guard Configuration
config/auth.php includes the admin guard:
'guards' => [
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
Log Permission Checks
config/permission.php:
'debug' => env('PERMISSION_DEBUG', false),
Test with tinker
php artisan tinker
>>> $admin = \Chiiya\FilamentAccessControl\Models\AdminUser::first();
>>> $admin->hasPermissionTo('edit-posts');
Custom Admin User Model
php artisan vendor:publish --tag="filament-access-control-model"
department_id):
class AdminUser extends \Chiiya\FilamentAccessControl\Models\AdminUser
{
protected $fillable = ['department_id', ...];
}
Custom Registration Logic
create-super-admin command:
php artisan make:command CreateCustomSuperAdmin
Chiiya\FilamentAccessControl\Console\Commands\CreateSuperAdmin.Custom Permission Tables
Permission model to add custom tables:
$permission = Permission::create(['name' => 'manage-departments', 'table' => 'departments']);
Webhook Triggers
AdminUserCreated events:
use Chiiya\FilamentAccessControl\Events\AdminUserCreated;
AdminUserCreated::listen(function ($admin) {
// Send Slack notification, etc.
});
API Integration
AdminUser model in API routes:
Route::post('/admin/users', function (Request $request) {
$admin = AdminUser::create($request->validate([
'email' => 'required|email',
'name' => 'required',
]));
return response()->json($admin);
})->middleware('auth:admin');
How can I help you explore Laravel packages today?