Laravel Bitwise Permission: el sistema de permisos que tu aplicación necesitaba

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.

PermisoValor
view1
view_any2
create4
update8
delete16
restore32
force_delete64
change_status128
assign256
support512

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

PlanPrecioProyectos
Single License$49 USD1
Developer License$99 USDIlimitados
Extended License$199 USDIlimitados + 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