Sistema d'Usuaris, Rols i Permisos

🎉 Sistema Professional Implementat

Hem implementat un sistema complet de gestió d'usuaris utilitzant Filament 3 i Spatie Laravel Permission, que proporciona autenticació, autorització, rols i permisos granulars.

📦 Components del Sistema

Spatie Permission

Package professional per gestionar rols i permisos en Laravel. Proporciona un sistema flexible i escalable.

  • ✅ Rols assignables
  • ✅ Permisos granulars
  • ✅ Multi-rol per usuari
  • ✅ Cache optimitzat

Filament Admin

Framework modern per crear panels d'administració amb Laravel. Interfície elegant i funcional.

  • ✅ CRUD automàtic
  • ✅ Formularis reactius
  • ✅ Taules amb filtres
  • ✅ Dark mode integrat

Policies de Seguretat

Sistema de policies Laravel per controlar qui pot fer què en cada recurs del sistema.

  • ✅ Accés controlat
  • ✅ Validació automàtica
  • ✅ Protecció anti auto-eliminació
  • ✅ Auditoria d'accions

🛠️ Recursos Implementats

UserResource

Gestió completa d'usuaris amb avatar, rols i permisos

RoleResource

Creació i gestió de rols amb assignació de permisos

PermissionResource

Administració de permisos individuals del sistema

👥 Rols Configurats

Admin

Accés Total

68 permisos

  • Gestionar usuaris, rols i permisos
  • CRUD sobre totes les dades
  • Exportar informes
  • Configuració del sistema
No pot eliminar-se a si mateix

Editor

Gestió de Dades

46 permisos

  • Gestionar clients i productes
  • Crear i editar vendes/compres
  • Gestionar proveïdors i empleats
  • Veure i exportar informes
NO pot gestionar usuaris

Viewer

Només Lectura

7 permisos

  • Veure clients i productes
  • Consultar vendes i compres
  • Veure proveïdors i empleats
  • Accés als informes
NO pot crear ni editar res

🔑 Permisos Granulars

Sistema de 68 permisos organitzats per entitats:

Clients
view_clients create_clients edit_clients delete_clients
Productes
view_products create_products edit_products delete_products
Vendes
view_sales create_sales edit_sales delete_sales
Compres
view_purchases create_purchases edit_purchases delete_purchases
Proveïdors
view_suppliers create_suppliers edit_suppliers delete_suppliers
Empleats
view_employees create_employees edit_employees delete_employees
Informes
view_reports export_reports
Sistema
view_users create_users edit_users delete_users manage_roles manage_permissions

✨ Funcionalitats Implementades

Gestió de Perfil
  • Editar nom i email propis
  • Pujar avatar amb editor d'imatges
  • Retallador circular automàtic
  • Canviar contrasenya amb validació
  • Avatar al navbar i menú d'usuari
Seguretat
  • Policies de Laravel implementades
  • Control d'accés per recurs
  • Protecció anti auto-eliminació admin
  • Validació de contrasenya actual
  • Cache de permisos optimitzat
Gestió d'Usuaris
  • Llistat amb avatars circulars
  • Filtres per rol
  • Assignació multi-rol
  • Permisos addicionals individuals
  • Badges de color per cada rol
Navegació
  • Secció "Gestió d'Usuaris" al menú
  • Enllaç ràpid al frontend
  • Menú d'usuari personalitzat
  • Breadcrumbs automàtics
  • Icones heroicons modernes

💻 Implementació Tècnica

Passos d'Implementació
1Instal·lació de Spatie Permission
composer require spatie/laravel-permission
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate
2Configuració del Model User
use Spatie\Permission\Traits\HasRoles;
use Filament\Models\Contracts\FilamentUser;
use Filament\Models\Contracts\HasAvatar;

class User extends Authenticatable implements FilamentUser, HasAvatar
{
    use HasRoles;
    
    public function canAccessPanel(Panel $panel): bool
    {
        return $this->hasAnyRole(['admin', 'editor', 'viewer']);
    }
    
    public function getFilamentAvatarUrl(): ?string
    {
        return $this->avatar 
            ? asset('storage/' . $this->avatar) 
            : 'https://ui-avatars.com/api/?name=' . urlencode($this->name);
    }
}
3Creació de Resources Filament
php artisan make:filament-resource User --generate
# Crear manualment: RoleResource i PermissionResource
4Implementació de Policies
php artisan make:policy UserPolicy --model=User

public function viewAny(User $user): bool
{
    return $user->hasRole('admin');
}

public function delete(User $user, User $model): bool
{
    return $user->hasRole('admin') && $user->id !== $model->id;
}
5Seeder amb Dades Inicials
php artisan make:seeder RolesAndPermissionsSeeder
php artisan db:seed --class=RolesAndPermissionsSeeder

📝 Exemples de Codi

Comprovar Permisos al Controlador
// Comprovar si usuari té un permís específic
if (auth()->user()->can('edit_sales')) {
    // Pot editar vendes
}

// Comprovar si usuari té un rol
if (auth()->user()->hasRole('admin')) {
    // És administrador
}

// Comprovar múltiples rols
if (auth()->user()->hasAnyRole(['admin', 'editor'])) {
    // És admin o editor
}

// Assignar rol a un usuari
$user->assignRole('editor');

// Donar permís directe a un usuari
$user->givePermissionTo('view_reports');
Protegir Routes
// Només usuaris amb rol admin
Route::middleware(['auth', 'role:admin'])->group(function () {
    Route::get('/admin/settings', [SettingsController::class, 'index']);
});

// Usuaris amb permís específic
Route::middleware(['auth', 'permission:edit_sales'])->group(function () {
    Route::post('/sales', [SalesController::class, 'store']);
});

// Múltiples permisos
Route::middleware(['auth', 'permission:view_reports|export_reports'])->group(function () {
    Route::get('/reports', [ReportController::class, 'index']);
});
Assignar Rols i Permisos
// Crear usuari i assignar rol
$user = User::create([
    'name' => 'Joan Puig',
    'email' => 'joan@example.com',
    'password' => Hash::make('password'),
]);
$user->assignRole('admin');

// Crear rol amb permisos
$role = Role::create(['name' => 'comptable']);
$role->givePermissionTo(['view_sales', 'create_sales', 'view_reports']);

// Assignar permís a un rol
$adminRole = Role::findByName('admin');
$adminRole->givePermissionTo(Permission::all());

⚡ Accions Ràpides

Neteja de Cache
php artisan permission:cache-reset
php artisan optimize:clear
Crear Usuari Admin
php artisan tinker
$user = User::find(1);
$user->assignRole('admin');

🎯 Prova el Sistema Ara!

Accedeix al panel d'administració i explora totes les funcionalitats del sistema d'usuaris