## Getting Started
### Minimal Setup
1. **Installation**
Add the bundle via Composer:
```bash
composer require austral/security-bundle
Register in config/bundles.php:
Austral\SecurityBundle\AustralSecurityBundle::class => ['all' => true],
Database Migration Run migrations (assuming Doctrine ORM):
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
First Use Case: User Creation
Use the UserManager service to create a user:
use Austral\SecurityBundle\Entity\User;
use Austral\SecurityBundle\Manager\UserManager;
$userManager = $this->container->get(UserManager::class);
$user = $userManager->createUser([
'username' => 'john_doe',
'email' => '[email protected]',
'password' => 'secure_password', // Auto-hashed
'roles' => ['ROLE_USER'],
]);
$userManager->persist($user);
Key Classes to Explore
Austral\SecurityBundle\Entity\User: Base user entity.Austral\SecurityBundle\Entity\Role: Role management.Austral\SecurityBundle\Entity\UserGroup: Group-based permissions.Austral\SecurityBundle\Manager\UserManager: Core user operations.// Create
$user = $userManager->createUser($data);
// Update
$user->setEmail('[email protected]');
$userManager->updateUser($user);
// Delete (soft-delete by default)
$userManager->deleteUser($user);
UserManager::hashPassword() for manual hashing or let the bundle auto-hash during creation.$user->addRole('ROLE_ADMIN');
$userManager->updateUser($user);
$groupManager = $this->container->get(\Austral\SecurityBundle\Manager\GroupManager::class);
$group = $groupManager->createGroup('Editors');
$group->addUser($user);
$groupManager->persist($group);
security.yaml:
providers:
austral_users:
entity:
class: Austral\SecurityBundle\Entity\User
property: username
firewalls:
main:
provider: austral_users
form_login: ~
UserCreatedEvent):
use Austral\SecurityBundle\Event\UserEvents;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
#[AsEventListener(event: UserEvents::USER_CREATED)]
public function onUserCreated(UserCreatedEvent $event) {
$user = $event->getUser();
// Send welcome email, etc.
}
# config/api/resources.yaml
resources:
Austral\SecurityBundle\Entity\User:
operations:
get:
security: "is_granted('ROLE_ADMIN')"
User entity extends Austral\SecurityBundle\Entity\AbstractUser:
use Austral\SecurityBundle\Entity\AbstractUser;
class User extends AbstractUser { ... }
User entity:
use Austral\SecurityBundle\Entity\User as BaseUser;
class User extends BaseUser {
#[ORM\Column]
private ?string $customField = null;
// Getters/setters...
}
php bin/console austral:security:create-user jane_doe [email protected]
Entity Inheritance
AbstractUser, do not override __construct() or Doctrine’s lifecycle methods (e.g., prePersist). The bundle handles these internally.__set_state() or static factory methods for initialization.Password Hashing
UserManager::hashPassword(). Directly passing plaintext to setPassword() may fail silently.InvalidPasswordException.Role Hierarchy
ROLE_ADMIN > ROLE_USER). Implement this in your Voter or AccessControl logic.RoleHierarchyVoter for this.Soft Deletes
deletedAt field). Use UserManager::forceDeleteUser() for hard deletes.$users = $userManager->findAll(['deletedAt' => null]);
Group Permissions
PostPersist event to mirror group roles.Event Dispatching
# config/services.yaml
Austral\SecurityBundle\:
resource: '../vendor/austral/security-bundle/config/services.yaml'
autowire: true
Migration Issues
austral/entity-bundle dependencies.User fields not in migrations).php bin/console doctrine:schema:update --force.Permission Denied
security.yaml firewall matches the bundle’s user provider:
# Wrong (if using custom property)
property: email
php bin/console debug:security to inspect providers.Custom User Providers
Austral\SecurityBundle\Provider\UserProviderInterface for non-Doctrine users (e.g., LDAP).Event Subscribers
#[AsEventListener(UserEvents::USER_UPDATED)]
public function onUserUpdated(UserUpdatedEvent $event) {
// Log changes, notify admins, etc.
}
Voters
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class GroupVoter extends Voter {
protected function supports(string $attribute, $subject): bool {
return $attribute === 'GROUP_EDIT';
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool {
$user = $token->getUser();
return $user->hasGroup('Editors');
}
}
API Filters
# config/api/platform.yaml
filters:
role_filter:
property: 'user.roles'
operator: 'in'
value: ['ROLE_ADMIN']
Default Password Hasher
UserPasswordHasher. To customize:
# config/services.yaml
Austral\SecurityBundle\Manager\UserManager:
arguments:
$passwordHasher: '@security.user_password_hasher' # Override if needed
Group Namespace
GROUP_ by default. Change in config:
# config/packages/austral_security.yaml
austral_security:
group:
prefix: 'ROLE_GROUP_'
Audit Logging
austral_security:
audit:
enabled: true
log_channel: 'security'
monolog bundle.Eager-Loading
$users = $userManager->findAll(['with' => ['groups', 'roles']]);
Caching Roles
framework:
cache:
pools:
security.role_cache:
adapter: cache.app
Bulk Operations
$userManager->setBatchMode(true);
How can I help you explore Laravel packages today?