feat(add Roles & Permission for Users)
All checks were successful
Deploy Roxane to Preprod / deploy (push) Successful in 1m18s

This commit is contained in:
2026-02-03 11:57:36 +01:00
parent f39651748d
commit 6a7a95f15b
16 changed files with 996 additions and 12 deletions

View File

@@ -2,9 +2,12 @@
namespace App\Filament\Resources\Users\Schemas;
use App\Models\User;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
use Illuminate\Support\Facades\Hash;
class UserForm
{
@@ -13,15 +16,26 @@ class UserForm
return $schema
->components([
TextInput::make('name')
->label(User::getAttributeLabel('name'))
->required(),
TextInput::make('email')
->label(User::getAttributeLabel('email'))
->label('Email address')
->email()
->required(),
DateTimePicker::make('email_verified_at'),
DateTimePicker::make('email_verified_at')
->label(User::getAttributeLabel('email_verified_at')),
TextInput::make('password')
->label(User::getAttributeLabel('password'))
->password()
->required(),
->dehydrated(fn ($state) => filled($state))
->dehydrateStateUsing(fn ($state) => Hash::make($state)),
Select::make('role')
->label(User::getAttributeLabel('role'))
->relationship('roles', 'name')
->multiple()
->preload()
->searchable()
]);
}
}

View File

@@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace App\Policies;
use Illuminate\Foundation\Auth\User as AuthUser;
use App\Models\MemberGroup;
use Illuminate\Auth\Access\HandlesAuthorization;
class MemberGroupPolicy
{
use HandlesAuthorization;
public function viewAny(AuthUser $authUser): bool
{
return $authUser->can('ViewAny:MemberGroup');
}
public function view(AuthUser $authUser, MemberGroup $memberGroup): bool
{
return $authUser->can('View:MemberGroup');
}
public function create(AuthUser $authUser): bool
{
return $authUser->can('Create:MemberGroup');
}
public function update(AuthUser $authUser, MemberGroup $memberGroup): bool
{
return $authUser->can('Update:MemberGroup');
}
public function delete(AuthUser $authUser, MemberGroup $memberGroup): bool
{
return $authUser->can('Delete:MemberGroup');
}
public function restore(AuthUser $authUser, MemberGroup $memberGroup): bool
{
return $authUser->can('Restore:MemberGroup');
}
public function forceDelete(AuthUser $authUser, MemberGroup $memberGroup): bool
{
return $authUser->can('ForceDelete:MemberGroup');
}
public function forceDeleteAny(AuthUser $authUser): bool
{
return $authUser->can('ForceDeleteAny:MemberGroup');
}
public function restoreAny(AuthUser $authUser): bool
{
return $authUser->can('RestoreAny:MemberGroup');
}
public function replicate(AuthUser $authUser, MemberGroup $memberGroup): bool
{
return $authUser->can('Replicate:MemberGroup');
}
public function reorder(AuthUser $authUser): bool
{
return $authUser->can('Reorder:MemberGroup');
}
}

View File

@@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace App\Policies;
use Illuminate\Foundation\Auth\User as AuthUser;
use App\Models\Member;
use Illuminate\Auth\Access\HandlesAuthorization;
class MemberPolicy
{
use HandlesAuthorization;
public function viewAny(AuthUser $authUser): bool
{
return $authUser->can('ViewAny:Member');
}
public function view(AuthUser $authUser, Member $member): bool
{
return $authUser->can('View:Member');
}
public function create(AuthUser $authUser): bool
{
return $authUser->can('Create:Member');
}
public function update(AuthUser $authUser, Member $member): bool
{
return $authUser->can('Update:Member');
}
public function delete(AuthUser $authUser, Member $member): bool
{
return $authUser->can('Delete:Member');
}
public function restore(AuthUser $authUser, Member $member): bool
{
return $authUser->can('Restore:Member');
}
public function forceDelete(AuthUser $authUser, Member $member): bool
{
return $authUser->can('ForceDelete:Member');
}
public function forceDeleteAny(AuthUser $authUser): bool
{
return $authUser->can('ForceDeleteAny:Member');
}
public function restoreAny(AuthUser $authUser): bool
{
return $authUser->can('RestoreAny:Member');
}
public function replicate(AuthUser $authUser, Member $member): bool
{
return $authUser->can('Replicate:Member');
}
public function reorder(AuthUser $authUser): bool
{
return $authUser->can('Reorder:Member');
}
}

View File

@@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace App\Policies;
use Illuminate\Foundation\Auth\User as AuthUser;
use App\Models\Membership;
use Illuminate\Auth\Access\HandlesAuthorization;
class MembershipPolicy
{
use HandlesAuthorization;
public function viewAny(AuthUser $authUser): bool
{
return $authUser->can('ViewAny:Membership');
}
public function view(AuthUser $authUser, Membership $membership): bool
{
return $authUser->can('View:Membership');
}
public function create(AuthUser $authUser): bool
{
return $authUser->can('Create:Membership');
}
public function update(AuthUser $authUser, Membership $membership): bool
{
return $authUser->can('Update:Membership');
}
public function delete(AuthUser $authUser, Membership $membership): bool
{
return $authUser->can('Delete:Membership');
}
public function restore(AuthUser $authUser, Membership $membership): bool
{
return $authUser->can('Restore:Membership');
}
public function forceDelete(AuthUser $authUser, Membership $membership): bool
{
return $authUser->can('ForceDelete:Membership');
}
public function forceDeleteAny(AuthUser $authUser): bool
{
return $authUser->can('ForceDeleteAny:Membership');
}
public function restoreAny(AuthUser $authUser): bool
{
return $authUser->can('RestoreAny:Membership');
}
public function replicate(AuthUser $authUser, Membership $membership): bool
{
return $authUser->can('Replicate:Membership');
}
public function reorder(AuthUser $authUser): bool
{
return $authUser->can('Reorder:Membership');
}
}

View File

@@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace App\Policies;
use Illuminate\Foundation\Auth\User as AuthUser;
use App\Models\Package;
use Illuminate\Auth\Access\HandlesAuthorization;
class PackagePolicy
{
use HandlesAuthorization;
public function viewAny(AuthUser $authUser): bool
{
return $authUser->can('ViewAny:Package');
}
public function view(AuthUser $authUser, Package $package): bool
{
return $authUser->can('View:Package');
}
public function create(AuthUser $authUser): bool
{
return $authUser->can('Create:Package');
}
public function update(AuthUser $authUser, Package $package): bool
{
return $authUser->can('Update:Package');
}
public function delete(AuthUser $authUser, Package $package): bool
{
return $authUser->can('Delete:Package');
}
public function restore(AuthUser $authUser, Package $package): bool
{
return $authUser->can('Restore:Package');
}
public function forceDelete(AuthUser $authUser, Package $package): bool
{
return $authUser->can('ForceDelete:Package');
}
public function forceDeleteAny(AuthUser $authUser): bool
{
return $authUser->can('ForceDeleteAny:Package');
}
public function restoreAny(AuthUser $authUser): bool
{
return $authUser->can('RestoreAny:Package');
}
public function replicate(AuthUser $authUser, Package $package): bool
{
return $authUser->can('Replicate:Package');
}
public function reorder(AuthUser $authUser): bool
{
return $authUser->can('Reorder:Package');
}
}

View File

@@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace App\Policies;
use Illuminate\Foundation\Auth\User as AuthUser;
use Spatie\Permission\Models\Role;
use Illuminate\Auth\Access\HandlesAuthorization;
class RolePolicy
{
use HandlesAuthorization;
public function viewAny(AuthUser $authUser): bool
{
return $authUser->can('ViewAny:Role');
}
public function view(AuthUser $authUser, Role $role): bool
{
return $authUser->can('View:Role');
}
public function create(AuthUser $authUser): bool
{
return $authUser->can('Create:Role');
}
public function update(AuthUser $authUser, Role $role): bool
{
return $authUser->can('Update:Role');
}
public function delete(AuthUser $authUser, Role $role): bool
{
return $authUser->can('Delete:Role');
}
public function restore(AuthUser $authUser, Role $role): bool
{
return $authUser->can('Restore:Role');
}
public function forceDelete(AuthUser $authUser, Role $role): bool
{
return $authUser->can('ForceDelete:Role');
}
public function forceDeleteAny(AuthUser $authUser): bool
{
return $authUser->can('ForceDeleteAny:Role');
}
public function restoreAny(AuthUser $authUser): bool
{
return $authUser->can('RestoreAny:Role');
}
public function replicate(AuthUser $authUser, Role $role): bool
{
return $authUser->can('Replicate:Role');
}
public function reorder(AuthUser $authUser): bool
{
return $authUser->can('Reorder:Role');
}
}

View File

@@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace App\Policies;
use Illuminate\Foundation\Auth\User as AuthUser;
use App\Models\Service;
use Illuminate\Auth\Access\HandlesAuthorization;
class ServicePolicy
{
use HandlesAuthorization;
public function viewAny(AuthUser $authUser): bool
{
return $authUser->can('ViewAny:Service');
}
public function view(AuthUser $authUser, Service $service): bool
{
return $authUser->can('View:Service');
}
public function create(AuthUser $authUser): bool
{
return $authUser->can('Create:Service');
}
public function update(AuthUser $authUser, Service $service): bool
{
return $authUser->can('Update:Service');
}
public function delete(AuthUser $authUser, Service $service): bool
{
return $authUser->can('Delete:Service');
}
public function restore(AuthUser $authUser, Service $service): bool
{
return $authUser->can('Restore:Service');
}
public function forceDelete(AuthUser $authUser, Service $service): bool
{
return $authUser->can('ForceDelete:Service');
}
public function forceDeleteAny(AuthUser $authUser): bool
{
return $authUser->can('ForceDeleteAny:Service');
}
public function restoreAny(AuthUser $authUser): bool
{
return $authUser->can('RestoreAny:Service');
}
public function replicate(AuthUser $authUser, Service $service): bool
{
return $authUser->can('Replicate:Service');
}
public function reorder(AuthUser $authUser): bool
{
return $authUser->can('Reorder:Service');
}
}

View File

@@ -0,0 +1,67 @@
<?php
namespace App\Policies;
use Illuminate\Foundation\Auth\User as AuthUser;
use Illuminate\Auth\Access\HandlesAuthorization;
class UserPolicy
{
use HandlesAuthorization;
public function viewAny(AuthUser $authUser): bool
{
return $authUser->can('ViewAny:User');
}
public function view(AuthUser $authUser): bool
{
return $authUser->can('View:User');
}
public function create(AuthUser $authUser): bool
{
return $authUser->can('Create:User');
}
public function update(AuthUser $authUser): bool
{
return $authUser->can('Update:User');
}
public function delete(AuthUser $authUser): bool
{
return $authUser->can('Delete:User');
}
public function restore(AuthUser $authUser): bool
{
return $authUser->can('Restore:User');
}
public function forceDelete(AuthUser $authUser): bool
{
return $authUser->can('ForceDelete:User');
}
public function forceDeleteAny(AuthUser $authUser): bool
{
return $authUser->can('ForceDeleteAny:User');
}
public function restoreAny(AuthUser $authUser): bool
{
return $authUser->can('RestoreAny:User');
}
public function replicate(AuthUser $authUser): bool
{
return $authUser->can('Replicate:User');
}
public function reorder(AuthUser $authUser): bool
{
return $authUser->can('Reorder:User');
}
}

View File

@@ -3,6 +3,7 @@
namespace App\Providers\Filament;
use Andreia\FilamentNordTheme\FilamentNordThemePlugin;
use BezhanSalleh\FilamentShield\FilamentShieldPlugin;
use App\Filament\Resources\Members\Widgets\MemberCount;
use App\Filament\Resources\Memberships\Widgets\MembershipsChart;
use Filament\Http\Middleware\Authenticate;
@@ -58,6 +59,10 @@ class AdminPanelProvider extends PanelProvider
DisableBladeIconComponents::class,
DispatchServingFilamentEvent::class,
])
->plugins([
FilamentShieldPlugin::make()
->navigationGroup('Gestion des accès'),
])
->authMiddleware([
Authenticate::class,
]);