PHP code example of sylvestre / user-session-bundle
1. Go to this page and download the library: Download sylvestre/user-session-bundle library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
use UserSessionBundle\Service\UserSessionManager;
class AuthController
{
public function login(Request $request, UserSessionManager $sessionManager)
{
// Votre logique d'authentification...
$session = $sessionManager->createSession(
$user,
'email', // ou 'google', 'facebook', etc.
$request
);
// Incluez le sessionId dans votre JWT
$jwt = $this->createJWT([
'userId' => $user->getId(),
'sessionId' => $session->getSessionId()
]);
return new JsonResponse(['token' => $jwt]);
}
}
// 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);
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));
}
// 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;
}
}
// 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;
}
}
bash
php bin/console doctrine:migrations:diff
bash
# Vérifiez la migration générée dans migrations/
php bin/console doctrine:migrations:migrate
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
bash
# 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