codeconsortium/ccdn-user-security-bundle
Installation Add the bundle via Composer:
composer require codeconsortium/ccdn-user-security-bundle
Register the bundle in config/bundles.php:
return [
// ...
CodeConsortium\CCDNUserSecurityBundle\CCDNUserSecurityBundle::class => ['all' => true],
];
Configuration Publish the default configuration:
php bin/console ccdn-user-security:install
Review and customize config/packages/ccdn_user_security.yaml (if published).
First Use Case Secure a route with role-based access:
# config/routes.yaml
secured_route:
path: /admin
controller: App\Controller\AdminController::index
methods: GET
roles: ROLE_ADMIN
Role-Based Access Control (RBAC)
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
class AdminController extends AbstractController {
/**
* @Security("has_role('ROLE_ADMIN')")
*/
public function index() { ... }
}
User entity:
$user->addRole('ROLE_EDITOR');
$user->removeRole('ROLE_USER');
Password Policies
config/packages/ccdn_user_security.yaml:
ccdn_user_security:
password:
min_length: 12
require_uppercase: true
require_numbers: true
$validator = $this->get('validator');
$errors = $validator->validate($user, $constraints);
Session Management
ccdn_user_security:
session:
lifetime: 3600 # 1 hour
$this->get('ccdn_user_security.session_handler')->touch();
Event-Driven Security
// src/EventListener/SecurityListener.php
class SecurityListener implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [
SecurityEvents::LOGIN_FAILURE => 'onLoginFailure',
];
}
}
security.yaml:
security:
providers:
ccdn_user_provider:
entity: { class: App\Entity\User, property: email }
firewalls:
main:
form_login:
provider: ccdn_user_provider
CCDNUserProvider for custom logic:
class CustomUserProvider extends CCDNUserProvider {
public function loadUserByUsername($username) { ... }
}
# config/packages/api_platform.yaml
api_platform:
formats:
jsonld:
mime_types: ['application/ld+json']
security:
role_hierarchy:
ROLE_API_USER: ROLE_USER
Deprecation Warnings
composer.json to avoid breaking changes.Configuration Overrides
php bin/console cache:clear
Session Handling Quirks
ccdn_user_security:
session:
storage: redis
host: 127.0.0.1
port: 6379
Role Hierarchy Issues
security.yaml:
security:
role_hierarchy:
ROLE_ADMIN: [ROLE_USER, ROLE_EDITOR]
Enable Debug Mode
# config/packages/dev/ccdn_user_security.yaml
ccdn_user_security:
debug: true
var/log/dev.log.Common Errors
User entity implements CCDNUserInterface.PasswordEncoder compatibility (use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface).session.save_path is writable.Database Schema
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Custom Validators
Extend CCDNPasswordValidator:
class CustomPasswordValidator extends CCDNPasswordValidator {
public function validatePassword($password, $user) { ... }
}
Register as a service:
services:
App\Security\CustomPasswordValidator:
tags: [ccdn_user_security.password_validator]
Event Subscribers
Create custom subscribers for CCDNUserEvents:
class CustomUserSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [
CCDNUserEvents::USER_CREATED => 'onUserCreated',
];
}
}
Twig Extensions Add security helpers to Twig:
class CCDNTwigExtension extends \Twig\Extension\AbstractExtension {
public function getFunctions() {
return [
new \Twig\TwigFunction('has_role', [$this, 'hasRole']),
];
}
}
{% if has_role('ROLE_ADMIN') %}
<a href="/admin">Admin Panel</a>
{% endif %}
How can I help you explore Laravel packages today?