PHPackages                             sylvestre/user-session-bundle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. sylvestre/user-session-bundle

ActiveSymfony-bundle[Authentication &amp; Authorization](/categories/authentication)

sylvestre/user-session-bundle
=============================

Advanced JWT multi-device user session management for Symfony applications

1.1.4(9mo ago)024MITPHPPHP &gt;=8.2

Since Jun 11Pushed 9mo agoCompare

[ Source](https://github.com/Sylv3str3/symfony-user-session)[ Packagist](https://packagist.org/packages/sylvestre/user-session-bundle)[ RSS](/packages/sylvestre-user-session-bundle/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (9)Versions (6)Used By (0)

UserSessionBundle
=================

[](#usersessionbundle)

Un bundle Symfony 6+ qui offre une gestion avancée des sessions utilisateur JWT multi-device avec suivi des connexions et suppression.

Pourquoi ce bundle ?
--------------------

[](#pourquoi-ce-bundle-)

Ce bundle a été créé pour résoudre plusieurs défis courants liés à la gestion des sessions JWT dans les applications Symfony modernes :

Caractéristiques
----------------

[](#caractéristiques)

- 📱 Support multi-device avec fingerprinting
- 🔐 Gestion de sessions JWT sécurisée
- 🔄 Limitation configurable des sessions simultanées
- 📊 Suivi des connexions actives
- 🚫 Suppression automatique des sessions expirées
- ⚡ Intégration simple avec votre système d'authentification existant

### 1. Gestion Multi-Device

[](#1-gestion-multi-device)

- Permet aux utilisateurs de se connecter depuis plusieurs appareils simultanément
- Garde une trace de chaque session active par appareil
- Limite configurable du nombre de sessions simultanées

### 2. Sécurité Renforcée

[](#2-sécurité-renforcée)

- Détection des appareils via fingerprinting
- Possibilité de révoquer des sessions spécifiques
- Protection contre la réutilisation des tokens révoqués
- Traçabilité complète des connexions

### 3. Intégration avec JWT

[](#3-intégration-avec-jwt)

- Fonctionne en complément de LexikJWTAuthenticationBundle
- Ajoute une couche de gestion de session sans compromettre la nature stateless des JWT
- Permet la révocation des tokens JWT (normalement impossible)

### 4. Suivi des Connexions

[](#4-suivi-des-connexions)

- Interface d'administration pour visualiser les sessions actives
- Historique des connexions par utilisateur
- Détection des appareils et navigateurs utilisés

### 5. Flexibilité

[](#5-flexibilité)

- Configuration simple via YAML
- Événements personnalisables
- Adaptable à différentes stratégies d'authentification
- Système d'entité extensible

Prérequis
---------

[](#prérequis)

- PHP 8.2 ou supérieur
- Symfony 6.x
- Doctrine ORM
- JWT Authentication configuré dans votre application

Installation
------------

[](#installation)

1. Installez le bundle via Composer :

```
composer require sylvestre/user-session-bundle
```

2. Activez le bundle dans `config/bundles.php` :

```
return [
    // ...
    UserSessionBundle\UserSessionBundle::class => ['all' => true],
];
```

3. Mettez à jour votre schéma de base de données :

Générez une migration Doctrine :

```
php bin/console doctrine:migrations:diff
```

Vérifiez et appliquez la migration :

```
# Vérifiez la migration générée dans migrations/
php bin/console doctrine:migrations:migrate
```

Configuration
-------------

[](#configuration)

Dans votre fichier `config/packages/user_session.yaml` :

```
user_session:
  max_sessions_per_user: 5 # Nombre maximum de sessions simultanées par utilisateur
  update_threshold: 300 # Durée en secondes pour mettre à jour la session (par défaut: 5 minutes)
  user_session_class: App\Entity\CustomUserSession # Optionnel : Votre entité personnalisée
```

### Import des routes

[](#import-des-routes)

Dans votre `config/routes.yaml`, ajoutez :

```
user_session:
  resource: "@UserSessionBundle/Resources/config/routes.yaml"
  prefix: /api
```

### Vérification de l'installation

[](#vérification-de-linstallation)

Vous pouvez vérifier que le bundle est correctement installé avec les commandes suivantes :

```
# Vérifier que le bundle est reconnu
php bin/console debug:bundle UserSessionBundle

# Vérifier les routes disponibles
php bin/console debug:router | grep session

# Vérifier la configuration
php bin/console debug:config user_session
```

Utilisation
-----------

[](#utilisation)

### 1. Intégration avec votre système d'authentification

[](#1-intégration-avec-votre-système-dauthentification)

Pour intégrer le bundle avec votre système d'authentification existant, vous devez utiliser le service `UserSessionManager` pour créer et gérer les sessions utilisateur.

### 2. Création d'une nouvelle session

[](#2-création-dune-nouvelle-session)

```
use UserSessionBundle\Service\UserSessionManager;

class AuthController
{
    public function login(Request $request, UserSessionManager $sessionManager)
    {
        // Votre logique d'authentification...
        // Optional: collect device fingerprint data (e.g. from headers)
        $fingerprintData = [
            $request->headers->get('X-Device-Fingerprint'), // e.g. sent from app
            $request->headers->get('User-Agent'),
        ];
        $session = $sessionManager->createSession(
            $user,
            'email', // ou 'google', 'facebook', etc.
            $request,
            $fingerprintData // optional, pass null if not available
        );

        // Incluez le sessionId dans votre JWT
        $jwt = $this->createJWT([
            'userId' => $user->getId(),
            'sessionId' => $session->getSessionId()
        ]);

        return new JsonResponse(['token' => $jwt]);
    }
}
```

### 3. Gestion des sessions

[](#3-gestion-des-sessions)

```
// Valider une session
$session = $sessionManager->validateSession($sessionId);

// Supprimer une session spécifique
$sessionManager->deleteSession($sessionId);

// Supprimer toutes les sessions d'un utilisateur
$sessionManager->deleteAllUserSessions($user);
```

Sécurité
--------

[](#sécurité)

### Bonnes pratiques

[](#bonnes-pratiques)

1. **Device Fingerprinting** :

    - Personnalisez la méthode `generateDeviceFingerprint()` selon vos besoins
    - Ajoutez des paramètres supplémentaires pour renforcer l'identification
2. **Gestion des sessions** :

    - Implémentez une stratégie de nettoyage des anciennes sessions
    - Surveillez les tentatives de connexion suspectes

Personnalisation
----------------

[](#personnalisation)

Personnalisation des rôles
--------------------------

[](#personnalisation-des-rôles)

### Option 1 : Surcharge des routes

[](#option-1--surcharge-des-routes)

```
# config/routes/user_session.yaml
user_session_list_all:
  path: /api/admin/sessions
  controller: UserSessionBundle\Controller\UserSessionController::listAllSessions
  defaults:
    _role: ROLE_ADMIN
```

### Option 2 : Configuration de sécurité Symfony

[](#option-2--configuration-de-sécurité-symfony)

```
# config/packages/security.yaml
security:
  access_control:
    - { path: ^/api/admin/sessions, roles: ROLE_ADMIN }
    - { path: ^/api/sessions, roles: ROLE_USER }
```

### Fingerprint du device

[](#fingerprint-du-device)

Personnalisez la méthode `generateDeviceFingerprint()` dans `UserSessionManager` pour améliorer la détection des appareils :

```
private function generateDeviceFingerprint(Request $request): string
{
    // Ajoutez vos propres paramètres d'identification
    $data = [
        $request->headers->get('User-Agent'),
        $request->getClientIp(),
        // Autres paramètres...
    ];

    return hash('sha256', implode('|', $data));
}
```

### Events

[](#events)

Le bundle émet plusieurs événements que vous pouvez écouter :

- `UserSessionCreatedEvent` : Lors de la création d'une nouvelle session
- `UserSessionDeletedEvent` : Lors de la suppression d'une session
- `UserSessionInvalidatedEvent` : Lorsqu'une session est invalidée

Extension du Bundle
-------------------

[](#extension-du-bundle)

### Entité Personnalisée (Optionnel)

[](#entité-personnalisée-optionnel)

Si vous souhaitez étendre les fonctionnalités de l'entité UserSession, vous pouvez créer votre propre entité. Voici quelques exemples :

#### 1. Exemple Simple

[](#1-exemple-simple)

```
// src/Entity/CustomUserSession.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use UserSessionBundle\Model\AbstractUserSession;

#[ORM\Entity]
#[ORM\Table(name: 'user_sessions')]
class CustomUserSession extends AbstractUserSession
{
    #[ORM\ManyToOne(targetEntity: User::class)]
    #[ORM\JoinColumn(nullable: false)]
    private User $user;

    public function getUser(): User
    {
        return $this->user;
    }

    public function setUser(object $user): static
    {
        $this->user = $user;
        return $this;
    }
}
```

#### 2. Exemple avec API Platform

[](#2-exemple-avec-api-platform)

```
// src/Entity/CustomUserSession.php
namespace App\Entity;

use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use Doctrine\ORM\Mapping as ORM;
use UserSessionBundle\Model\AbstractUserSession;

#[ApiResource(
    operations: [
        new Get(),
        new GetCollection()
    ],
    security: "is_granted('ROLE_USER')"
)]
#[ORM\Entity]
#[ORM\Table(name: 'user_sessions')]
class CustomUserSession extends AbstractUserSession
{
    #[ORM\ManyToOne(targetEntity: User::class)]
    #[ORM\JoinColumn(nullable: false)]
    private User $user;

    #[ORM\Column(type: 'string', nullable: true)]
    private ?string $deviceName = null;

    #[ORM\Column(type: 'json', nullable: true)]
    private array $metadata = [];

    public function getUser(): User
    {
        return $this->user;
    }

    public function setUser(object $user): static
    {
        $this->user = $user;
        return $this;
    }

    public function getDeviceName(): ?string
    {
        return $this->deviceName;
    }

    public function setDeviceName(?string $deviceName): static
    {
        $this->deviceName = $deviceName;
        return $this;
    }

    public function getMetadata(): array
    {
        return $this->metadata;
    }

    public function setMetadata(array $metadata): static
    {
        $this->metadata = $metadata;
        return $this;
    }
}
```

#### 3. Configuration

[](#3-configuration)

Après avoir créé votre entité personnalisée, configurez le bundle pour l'utiliser :

```
# config/packages/user_session.yaml
user_session:
  user_session_class: App\Entity\CustomUserSession
  max_sessions_per_user: 5
  update_threshold: 300
```

#### 4. Migration

[](#4-migration)

Générez et appliquez la migration pour votre nouvelle entité :

```
php bin/console make:migration
php bin/console doctrine:migrations:migrate
```

Dépannage
---------

[](#dépannage)

### Problèmes courants

[](#problèmes-courants)

1. **Session non reconnue** :

    - Assurez-vous que la session existe en base de données
    - Validez le format de l'UUID de session
2. **Erreurs de configuration** :

    - Vérifiez que le bundle est bien enregistré dans `bundles.php`
    - Validez la configuration dans `user_session.yaml`
    - Assurez-vous que la base de données est à jour

Licence
-------

[](#licence)

Ce bundle est disponible sous la licence MIT.

###  Health Score

33

—

LowBetter than 74% of packages

Maintenance58

Moderate activity, may be stable

Popularity6

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~9 days

Total

5

Last Release

296d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/0794c72882d0b99fd1c195c79b7f4f8e5135fe65d18c1b520a8779a67ff2d2b7?d=identicon)[Sylv3str3](/maintainers/Sylv3str3)

---

Top Contributors

[![Sylv3str3](https://avatars.githubusercontent.com/u/139703387?v=4)](https://github.com/Sylv3str3 "Sylv3str3 (6 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/sylvestre-user-session-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/sylvestre-user-session-bundle/health.svg)](https://phpackages.com/packages/sylvestre-user-session-bundle)
```

###  Alternatives

[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M647](/packages/sylius-sylius)[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k16.7M308](/packages/easycorp-easyadmin-bundle)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.3M151](/packages/sulu-sulu)[contao/core-bundle

Contao Open Source CMS

1231.6M2.3k](/packages/contao-core-bundle)[prestashop/prestashop

PrestaShop is an Open Source e-commerce platform, committed to providing the best shopping cart experience for both merchants and customers.

9.0k15.4k](/packages/prestashop-prestashop)[web-auth/webauthn-framework

FIDO2/Webauthn library for PHP and Symfony Bundle.

50570.7k1](/packages/web-auth-webauthn-framework)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
