Si has trabajado con Laravel el tiempo suficiente, sabes que tarde o temprano el sistema de permisos termina convirtiéndose en un dolor de cabeza.
- Tablas pivot enormes.
- Consultas innecesarias.
- Roles difíciles de mantener.
- Imposible personalizar permisos por usuario.
Laravel Bitwise Permission resuelve este problema utilizando permisos bitwise, una técnica extremadamente rápida que permite almacenar múltiples permisos en un solo entero.
¿Cuál es el problema de los sistemas tradicionales?
La mayoría de paquetes funcionan mediante una estructura similar a esta:
users
↓
roles
↓
permissions
Cada vez que deseas comprobar un permiso normalmente necesitas varios joins o consultas adicionales.
Por ejemplo:
- comprobar un permiso;
- verificar varios botones en Blade;
- autorizar acciones en controladores.
Todo esto termina aumentando el número de consultas y el tiempo de respuesta.
La solución: permisos Bitwise
En lugar de guardar una fila por cada permiso, el paquete almacena un único número entero.
| Permiso | Valor |
|---|---|
| view | 1 |
| view_any | 2 |
| create | 4 |
| update | 8 |
| delete | 16 |
| restore | 32 |
| force_delete | 64 |
| change_status | 128 |
| assign | 256 |
| support | 512 |
Por ejemplo, un usuario con permisos de lectura y actualización tendrá:
1 + 2 + 8 = 11
Luego verificar un permiso es tan simple como:
11 & 8 === 8 // true
11 & 16 === 16 // false
✅ Sin tablas pivot.
✅ Sin joins.
✅ Sin consultas adicionales.
Instalación
Instala el paquete:
composer require henry-ht/laravel-bitwise-permission
Luego ejecuta el instalador:
php artisan bwp:install
El comando publica la configuración, ejecuta migraciones y genera los datos iniciales automáticamente.
Agrega el trait al modelo User
use HenryHt\BitwisePermission\Traits\HasPermissionsTrait;
class User extends Authenticatable
{
use HasPermissionsTrait;
}
Protege tus rutas
Route::middleware('bwp.permission')->group(function () {
Route::get('/leads', ...);
});
O protege acciones específicas:
Route::middleware('bwp.permission:create')->group(function () {
Route::post('/leads', ...);
});
Configuración legible
Uno de los objetivos del paquete fue que el archivo de configuración pudiera entenderse incluso sin conocer internamente cómo funciona.
'profile.*' => 'read access',
'leads.*' => 'modify access',
'contacts.*' => 'write access',
Los permisos utilizan nombres semánticos, mucho más fáciles de leer y mantener.
Super Admin integrado
Solo debes definir un rol:
'super_admin_role' => 'super_admin'
El paquete detecta automáticamente este rol y concede acceso completo sin realizar consultas adicionales.
auth()->user()->isSuperAdmin();
Roles individuales por usuario ⭐
Esta es probablemente la característica más potente del paquete.
En lugar de compartir el mismo rol entre decenas de usuarios, cada usuario obtiene automáticamente una copia de su rol base, permitiendo modificar únicamente sus permisos sin afectar a los demás.
app(RoleCloneService::class)
->cloneForUser($user, $baseRole);
Después puedes hacer cosas como:
$user->setPermission('reports.*', 'read access');
$user->setPermission('deals.*', 'write access');
O actualizar múltiples permisos al mismo tiempo.
Esto elimina la necesidad de crear decenas de variantes del mismo rol.
Menús dinámicos
El paquete incluye un sistema completo de menús.
Solo defines el árbol en la configuración:
'base_menus' => [
...
]
Y luego obtienes automáticamente el menú permitido para el usuario:
auth()->user()->getMenu();
Además, los menús tienen propagación automática:
- si deshabilitas el único hijo, el padre desaparece;
- si vuelves a habilitar un hijo, el padre aparece nuevamente.
Todo funciona de forma recursiva.
Panel de administración incluido
El paquete incorpora una interfaz desarrollada con Livewire para administrar:
- Roles
- Permisos
- Rutas
- Accesos
- Menús
- Visibilidad del menú
Sin necesidad de construir un panel desde cero.
Sincronización automática de rutas
Registrar manualmente las rutas es cosa del pasado.
Simplemente ejecuta:
php artisan bwp:sync-routes
El comando detecta automáticamente las rutas nombradas y registra sus versiones wildcard.
Por ejemplo:
leads.index
leads.store
leads.update
se convierte en:
leads.*
Uso en Blade
@if(auth()->user()->canCreate())
@endif
@if(auth()->user()->canDelete())
@endif
@if(auth()->user()->isSuperAdmin())
@endif
Y también funciona perfectamente desde controladores y componentes Livewire.
Permisos personalizados
¿Necesitas más permisos?
Simplemente añade nuevos bits:
'export' => 1024,
'approve' => 2048,
'publish' => 4096,
Y luego:
auth()->user()->canCustom('export');
Licencias
| Plan | Precio | Proyectos |
|---|---|---|
| Single License | $49 USD | 1 |
| Developer License | $99 USD | Ilimitados |
| Extended License | $199 USD | Ilimitados + SaaS |
¿Para quién está pensado?
- SaaS multi-tenant.
- Sistemas con permisos granulares.
- Equipos que necesitan personalizar permisos por usuario.
- Proyectos que buscan máximo rendimiento.
Instalación
composer require henry-ht/laravel-bitwise-permission
php artisan bwp:install
📧 Contacto: contact@tchenry.com



