midnightluke/group-security-bundle
Symfony bundle for managing group-based security: define user groups, assign roles/permissions, and integrate authorization into your app. Provides services/configuration to simplify access control around group membership.
Installation
composer require midnightluke/group-security-bundle
Add to config/app.php under providers:
MidnightLuke\GroupSecurityBundle\GroupSecurityBundle::class,
Publish config (optional):
php artisan vendor:publish --provider="MidnightLuke\GroupSecurityBundle\GroupSecurityBundle" --tag="config"
First Use Case
config/group_security.php:
'groups' => [
'admin' => [
'roles' => ['ROLE_ADMIN'],
'permissions' => ['create_user', 'delete_user'],
],
],
use MidnightLuke\GroupSecurityBundle\Security\GroupSecurity;
public function index(GroupSecurity $groupSecurity)
{
if ($groupSecurity->hasGroup('admin')) {
return view('admin.dashboard');
}
abort(403);
}
Group Assignment Assign groups to users via middleware or event listeners:
// Example: Assign 'editor' group after registration
public function registered(UserRegistered $event)
{
$event->user->groups()->attach('editor');
}
Permission Checks
Use GroupSecurity service in controllers/services:
if ($groupSecurity->hasPermission('delete_user')) {
$user->delete();
}
Policy Integration Extend existing policies:
public function delete(User $user, User $model)
{
return $user->hasPermission('delete_user');
}
Middleware Protect routes:
Route::get('/admin', function () {
// ...
})->middleware('group:admin');
API Gate (Lumen/SPA)
$this->gate->define('edit-post', function ($user) {
return $user->hasPermission('edit_post');
});
Runtime Group Assignment
$groupSecurity->assignGroupToUser($userId, 'moderator', 30); // TTL in minutes
Group-Based Data Filtering
$posts = Post::whereHas('author.groups', function ($query) {
$query->where('name', 'editor');
})->get();
Caching Issues
Clear config cache after modifying group_security.php:
php artisan config:clear
Groups are cached by default for performance.
Case Sensitivity Group names/permissions are case-sensitive unless configured otherwise.
Database Schema
Ensure groups and group_user tables exist (migrations are not auto-published). Use:
php artisan vendor:publish --provider="MidnightLuke\GroupSecurityBundle\GroupSecurityBundle" --tag="migrations"
Log Group Assignments Enable debug mode in config:
'debug' => env('GROUP_SECURITY_DEBUG', false),
Logs will appear in storage/logs/laravel.log.
Check User Groups
$user->groups; // Collection of assigned groups
$groupSecurity->getUserGroups($userId);
Custom Storage Override storage engine via config:
'storage' => [
'driver' => 'database', // or 'cache', 'redis'
],
Event Listeners Extend group logic via events:
// Example: Revoke permissions on group removal
public function handle(GroupRemoved $event)
{
// Custom logic
}
Custom Permission Logic
Override PermissionChecker:
$groupSecurity->setPermissionChecker(new CustomPermissionChecker());
How can I help you explore Laravel packages today?