cwsps154/users-roles-permissions
Laravel package to manage users, roles, and permissions with a simple, structured approach. Assign roles to users, define permissions, and check access throughout your app. Lightweight and easy to integrate into existing projects.
Installation
composer require cwsps154/users-roles-permissions
Publish the package config and migrations:
php artisan vendor:publish --provider="Cwsps154\UsersRolesPermissions\UsersRolesPermissionsServiceProvider" --tag="config"
php artisan vendor:publish --provider="Cwsps154\UsersRolesPermissions\UsersRolesPermissionsServiceProvider" --tag="migrations"
php artisan migrate
Register Filament Resources
Add the following to app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->resources([
\Cwsps154\UsersRolesPermissions\Resources\UserResource::class,
\Cwsps154\UsersRolesPermissions\Resources\RoleResource::class,
\Cwsps154\UsersRolesPermissions\Resources\PermissionResource::class,
]);
}
First Use Case: Assign a Role to a User
Role-Based Access Control (RBAC)
PermissionResource (e.g., create-post, edit-user).RoleResource (e.g., "Editor" role gets create-post).UserResource.Dynamic Policy Integration
Use the package’s policies with Laravel’s built-in Gate system:
// app/Providers/AuthServiceProvider.php
public function boot()
{
Gate::define('update-post', function (User $user, Post $post) {
return $user->hasPermissionTo('edit-post');
});
}
Middleware for Route Protection
// app/Http/Kernel.php
protected $routeMiddleware = [
'role' => \Cwsps154\UsersRolesPermissions\Http\Middleware\CheckRole::class,
'permission' => \Cwsps154\UsersRolesPermissions\Http\Middleware\CheckPermission::class,
];
Apply in routes:
Route::get('/admin/posts', function () {
// ...
})->middleware(['role:admin']);
Bulk Operations
department field to users):
use Filament\Forms\Components\Select;
public static function form(Form $form): Form
{
return $form->schema([
Select::make('department')
->options(['HR', 'Engineering', 'Marketing'])
->required(),
// ... existing fields
]);
}
php artisan make:filament-api-resource UserResource
// database/seeders/RolePermissionSeeder.php
use Cwsps154\UsersRolesPermissions\Models\Role;
use Cwsps154\UsersRolesPermissions\Models\Permission;
public function run()
{
$adminRole = Role::create(['name' => 'admin']);
Permission::create(['name' => 'manage-users'])->roles()->attach($adminRole);
}
Caching Issues
php artisan filament:cache:clear
filament_* tables in the database.Permission Hierarchy Conflicts
create-post and another role with delete-post, the package does not automatically resolve conflicts. Explicitly define which permissions take precedence in your logic.Migration Conflicts
users table (e.g., added department), ensure the package’s migrations don’t overwrite your changes. Run:
php artisan migrate --pretend
to check for conflicts before migrating.Filament Widget Overrides
UserResource or RoleResource, ensure you extend the original class to retain package functionality:
class CustomUserResource extends \Cwsps154\UsersRolesPermissions\Resources\UserResource
{
// Your customizations
}
name of permissions/roles matches exactly (case-sensitive).php artisan tinker
>>> $user = App\Models\User::first();
>>> $user->hasPermissionTo('create-post'); // Should return true/false
pivot table (role_user) exists and has the correct columns (user_id, role_id).User model uses the correct belongsToMany relationship:
public function roles()
{
return $this->belongsToMany(Role::class);
}
Custom Permission Logic
Override the hasPermissionTo method in your User model:
public function hasPermissionTo($permission)
{
// Custom logic (e.g., check department + role)
return parent::hasPermissionTo($permission) && $this->department === 'admin';
}
Add Permission Groups
Extend the PermissionResource to support groups (e.g., "Posts", "Users"):
// app/Models/Permission.php
public function groups()
{
return $this->belongsToMany(PermissionGroup::class);
}
Audit Logging
Use Laravel’s audit package (e.g., spatie/laravel-audit-log) to track role/permission changes:
use Spatie\AuditLog\AuditLog;
// In your RoleResource's update method
AuditLog::log('updated role', $this->getUpdatedRoleData());
API Token Scopes Integrate with Laravel Sanctum/Passport to scope tokens by permissions:
// app/Models/User.php
public function getTokenScopes()
{
return $this->permissions->pluck('name');
}
How can I help you explore Laravel packages today?