Skip to main content
The user management system provides comprehensive tools for managing users, roles, and permissions using Spatie Laravel Permission package.

Permission Requirements

User management requires the access.admin.panel permission. All routes are protected by authentication, email verification, and permission middleware.

User Management Routes

User management uses Laravel’s resource routes:
// routes/web.php:83-85
Route::resource('users', UserController::class);
Route::resource('roles', RoleController::class);

User List

View and manage all users at /admin/users.

Livewire User List Component

The user list uses a reactive Livewire component with search, sort, and pagination:
// app/Livewire/Admin/UserList.php:9-76
class UserList extends Component
{
    use WithPagination;

    public $search = '';
    public $sortField = 'name';
    public $sortDirection = 'asc';
    public $showDeleteModal = false;
    public $userToDelete = null;

    protected $queryString = [
        'search' => ['except' => ''],
        'sortField' => ['except' => 'name'],
        'sortDirection' => ['except' => 'asc'],
    ];

    public function sortBy($field)
    {
        if ($this->sortField === $field) {
            $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc';
        } else {
            $this->sortField = $field;
            $this->sortDirection = 'asc';
        }
    }

    public function render()
    {
        $users = User::query()
            ->with('roles')
            ->when($this->search, function ($query) {
                $query->where('name', 'like', '%' . $this->search . '%')
                    ->orWhere('email', 'like', '%' . $this->search . '%');
            })
            ->orderBy($this->sortField, $this->sortDirection)
            ->paginate(10)
            ->withQueryString();

        return view('livewire.admin.user-list', ['users' => $users]);
    }
}

User List Features

Search

Search users by name or email address in real-time

Sort

Sort by any column (name, email, created date)

Paginate

10 users per page with pagination controls

Role Display

View assigned roles for each user

Creating Users

Create new users at /admin/users/create.
1

Navigate to Create User

Click “Create New User” button on the user list
2

Enter User Details

Fill in name, email, and password fields
3

Assign Roles

Select one or more roles (except Super Admin)
4

Save User

User account is created and roles are assigned

Create User Livewire Component

// app/Livewire/Admin/CreateUser.php:10-60
class CreateUser extends Component
{
    #[Validate('required|string|max:255')]
    public $name;

    #[Validate('required|email', as: 'Email Address')]
    public $email;

    #[Validate('nullable|min:8|confirmed')]
    public $password;

    public $password_confirmation;

    public $roles = [];
    public $availableRoles = [];

    public function mount()
    {
        // Load all roles except 'Super Admin'
        $this->availableRoles = Role::where('name', '!=', 'Super Admin')->pluck('name')->toArray();
    }

    public function save()
    {
        // Create a new user instance
        $user = new User();
        $user->name = $this->name;
        $user->email = $this->email;

        if ($this->password) {
            $user->password = bcrypt($this->password);
        }

        $user->save();

        // Sync roles, ensuring the 'Super Admin' role cannot be assigned
        $user->syncRoles(array_intersect($this->roles, $this->availableRoles));

        session()->flash('success', 'User created successfully.');

        return redirect()->route('admin.users.index');
    }
}

Validation Rules

User Creation Requirements
  • Name: Required, max 255 characters
  • Email: Required, valid email format, unique
  • Password: Optional, min 8 characters, must be confirmed
  • Roles: Optional, multiple roles can be assigned

Super Admin Protection

The Super Admin role cannot be assigned through the user creation form. This prevents accidental privilege escalation.

Editing Users

Edit existing users at /admin/users/{user}/edit.
1

Select User

Click “Edit” on any user in the list
2

Modify Details

Update name, email, password, or status
3

Manage Roles

Add or remove roles (Super Admin protected)
4

Ban/Unban User

Change user status to active or banned
5

Save Changes

User record is updated with new information

Edit User Livewire Component

// app/Livewire/Admin/EditUser.php:10-98
class EditUser extends Component
{
    public User $user;

    #[Validate('required|string|max:255')]
    public $name;

    #[Validate('required|email', as: 'Email Address')]
    public $email;

    #[Validate('nullable|min:8|confirmed')]
    public $password;

    public $password_confirmation;
    public $status;
    public $roles = [];
    public $availableRoles = [];

    public function mount(User $user)
    {
        $this->user = $user;
        $this->name = $user->name;
        $this->email = $user->email;
        $this->status = $user->status;

        // Load all roles except 'Super Admin'
        $this->availableRoles = Role::where('name', '!=', 'Super Admin')->pluck('name')->toArray();

        // Load assigned roles
        $this->roles = $user->roles->pluck('name')->toArray();
    }

    public function save()
    {
        // Save user details
        $this->user->name = $this->name;
        $this->user->email = $this->email;

        if ($this->password) {
            $this->user->password = bcrypt($this->password);
        }

        $this->user->save();

        // Check if the user has the 'Super Admin' role
        $hasSuperAdminRole = $this->user->hasRole('Super Admin');

        // If user has 'Super Admin', make sure it's not removed
        if ($hasSuperAdminRole) {
            $this->user->syncRoles(array_merge(['Super Admin'], array_intersect($this->roles, $this->availableRoles)));
        } else {
            $this->user->syncRoles(array_intersect($this->roles, $this->availableRoles));
        }

        session()->flash('success', 'User updated successfully.');

        return redirect()->route('admin.users.index');
    }
}

Preserving Super Admin Role

If a user has the Super Admin role, it cannot be removed through the edit form. This prevents accidental removal of super admin privileges.

Banning Users

Users can be banned to prevent access without deletion.

Ban User

// app/Livewire/Admin/EditUser.php:75-82
public function ban($id)
{
    $user = User::findOrFail($id);
    $user->status = 'banned';
    $user->save();

    return back()->with('message', 'User has been banned.');
}

Unban User

// app/Livewire/Admin/EditUser.php:84-91
public function unban()
{
    $this->user->status = 'active';
    $this->user->save();

    session()->flash('message', 'User has been unbanned.');
    return redirect()->route('admin.users.index');
}
User Status
  • active: User can access the system normally
  • banned: User is prevented from logging in

Deleting Users

Delete users with automatic cleanup of API tokens.

Delete Confirmation Modal

// app/Livewire/Admin/UserList.php:45-49
public function confirmDelete($userId)
{
    $this->userToDelete = $userId;
    $this->showDeleteModal = true;
}

Delete User

// app/Livewire/Admin/UserList.php:51-60
public function deleteUser()
{
    $user = User::findOrFail($this->userToDelete);
    $user->delete();

    $this->showDeleteModal = false;
    $this->userToDelete = null;

    session()->flash('message', 'User deleted successfully.');
}

User Deletion with Token Cleanup

// app/Http/Controllers/UserController.php:86-95
public function destroy(User $user)
{
    $user->tokens->each->delete(); // Revokes API tokens
    $user->delete(); // Deletes user

    session()->flash('message', 'User Deleted Successfully.');

    return redirect()->route('admin.users.index');
}
Permanent Deletion: User deletion is permanent and cannot be undone. All associated data (posts, comments, etc.) may be affected.

Role Management

Manage roles and permissions at /admin/roles.

Viewing Roles

// app/Http/Controllers/RoleController.php:14-19
public function index()
{
    $roles = Role::latest()->paginate(10);
    return view('admin.roles.index', compact('roles'));
}

Creating Roles

Create roles with custom permission sets.
1

Navigate to Create Role

Go to /admin/roles/create
2

Enter Role Name

Provide a descriptive role name (e.g., “Editor”, “Moderator”)
3

Select Permissions

Choose permissions grouped by category
4

Save Role

Role is created with assigned permissions
// app/Http/Controllers/RoleController.php:26-38
public function create()
{
    $role_permission = Permission::select('name', 'id')->distinct()->get();

    $custom_permission = [];

    foreach ($role_permission as $per) {
        $key = strstr($per->name, '.', true) ?: $per->name;
        $custom_permission[$key][] = $per;
    }

    return view('admin.roles.create', ['permissions' => $custom_permission]);
}

Permission Grouping

Permissions are grouped by prefix for easier management:
GroupPermissionsDescription
accessaccess.admin.panel, access.subscriber.areaSystem access
blogblog.create, blog.edit, blog.deleteBlog management
gallerygallery.upload, gallery.manageGallery management
useruser.create, user.edit, user.deleteUser management

Storing Roles

// app/Http/Controllers/RoleController.php:43-62
public function store(Request $request)
{
    $request->validate([
        'name' => 'required',
    ]);

    $role = Role::create([
        'name' => $request->name,
    ]);

    if ($request->permissions) {
        foreach ($request->permissions as $key => $value) {
            $role->givePermissionTo($value);
        }
    }

    return redirect()->route('roles.all');
}

Editing Roles

Update role names and permissions.
1

Select Role

Click “Edit” on any role in the list
2

Modify Role Name

Update the role name if needed
3

Adjust Permissions

Add or remove permissions
4

Save Changes

Role is updated with new configuration
// app/Http/Controllers/RoleController.php:75-94
public function edit(Role $role)
{
    $role->load('permissions');

    $permissions = Permission::select(['name', 'id'])
        ->when(config('database.default') === 'sqlite', function ($query) {
            return $query->selectRaw('name, MIN(id) as id');
        })
        ->groupBy('name')
        ->get();

    $groupedPermissions = $permissions->groupBy(function ($permission) {
        return strstr($permission->name, '.', true) ?: $permission->name;
    });

    return view('admin.roles.edit', [
        'role' => $role,
        'permissions' => $groupedPermissions
    ]);
}

Updating Roles

// app/Http/Controllers/RoleController.php:99-115
public function update(Request $request, $id)
{
    $role = Role::where('id', $id)->first();

    $request->validate([
        'name' => 'required'
    ]);

    $role->update([
        "name" => $request->name
    ]);

    $role->syncPermissions($request->permissions);

    return redirect()->route('admin.roles.index')->with('success', 'Roles Updated Successfully');
}

Deleting Roles

Delete roles with automatic permission cleanup.
// app/Http/Controllers/RoleController.php:133-138
public function destroy(Role $role)
{
    $role->delete();

    return redirect()->route('admin.roles.index')->with('success', 'Role deleted successfully.');
}
Role Deletion: When you delete a role, users with that role will lose those permissions. Consider reassigning users before deleting important roles.

Permission System

LaraCMS uses Spatie Laravel Permission for granular access control.

Key Permissions

// Required for admin panel access (routes/web.php:71)
->middleware('permission:access.admin.panel')

Common Permissions

PermissionDescriptionRequired For
access.admin.panelAccess admin dashboardAll admin routes
access.subscriber.areaAccess subscriber contentPremium features
blog.createCreate blog postsPost creation
blog.editEdit blog postsPost editing
blog.deleteDelete blog postsPost deletion
user.manageManage usersUser CRUD operations
role.manageManage rolesRole CRUD operations

Checking Permissions

// In controllers
if (!auth()->user()->can('access.admin.panel')) {
    abort(403);
}

// In Blade views
@can('access.admin.panel')
    <!-- Admin content -->
@endcan

// Using middleware
Route::middleware('permission:access.admin.panel')->group(function () {
    // Protected routes
});

Best Practices

Organize roles in a hierarchy:
  • Super Admin: Full system access (protected)
  • Admin: Most admin functions
  • Editor: Content management only
  • Moderator: User moderation
  • User: Basic access
Use consistent permission naming:
  • Format: resource.action (e.g., blog.create)
  • Group related permissions with same prefix
  • Use descriptive names
  • Document custom permissions
Always protect Super Admin role:
  • Exclude from dropdowns and selectors
  • Prevent removal through UI
  • Limit Super Admin assignments
  • Log Super Admin changes
Use banning instead of deletion when possible:
  • Preserves content ownership
  • Allows reactivation
  • Maintains data integrity
  • Consider soft deletes for important users

Troubleshooting

If users can’t access admin panel:
  • Verify access.admin.panel permission is assigned
  • Check role has correct permissions
  • Clear permission cache: php artisan permission:cache-reset
  • Verify user has the role assigned
If roles don’t show in dropdowns:
  • Check Super Admin filtering is working
  • Verify roles exist in database
  • Clear cache: php artisan cache:clear
  • Check database connection
If user deletion fails:
  • Check for foreign key constraints
  • Consider soft deletes
  • Ban user instead of deleting
  • Review cascading delete rules

Multi-Tenant Security

As a SaaS platform, security is critical:

Tenant Isolation

  • Users can only access their tenant’s data
  • Permissions are tenant-scoped
  • Super Admin role per tenant

Security Best Practices

  • Regular permission audits
  • Monitor Super Admin assignments
  • Log privilege changes
  • Review role permissions quarterly
  • Use 2FA for admin accounts (recommended)

Next Steps

Dashboard Overview

Return to admin dashboard documentation

URL Tools

Learn about URL shortener and redirects

Build docs developers (and LLMs) love