aboutsummaryrefslogtreecommitdiff
path: root/src/Service/session.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Service/session.php')
-rw-r--r--src/Service/session.php94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/Service/session.php b/src/Service/session.php
new file mode 100644
index 0000000..39c6ba2
--- /dev/null
+++ b/src/Service/session.php
@@ -0,0 +1,94 @@
1<?php
2// src/Service/session.php
3
4// à voir si c'est mieux avec:
5//use Symfony\Component\HttpFoundation\Session\Session;
6
7// note: session_regenerate_id(true) se trouve dans UserController::connect
8
9declare(strict_types=1);
10
11use Doctrine\ORM\EntityManager;
12use App\Service\URL;
13use App\Controller\UserController;
14
15function startSession(EntityManager $entityManager): void
16{
17 ini_set('session.cookie_samesite', 'Strict');
18 ini_set('session.cookie_httponly', 'On');
19 ini_set('session.use_strict_mode', 'On');
20 ini_set('session.cookie_secure', 'On');
21 session_start();
22 validateSession($entityManager);
23}
24
25function validateSession(EntityManager $entityManager): void
26{
27 if(defined('IS_ADMIN')){
28 return;
29 }
30
31 $is_admin = false;
32
33 if(isset($_SESSION['user']['id'])){
34 $user = UserController::getUserById($_SESSION['user']['id'], $entityManager);
35
36 // visiteur normal
37 if(!$user){
38 session_unset();
39 session_destroy();
40 header('Location: ' . new URL(['message' => 'session_invalide']));
41 die;
42 }
43
44 // MAJ de la session avec CERTAINES données
45 $_SESSION['user']['username'] = $user->getLogin();
46 $_SESSION['user']['role'] = $user->getRole();
47
48 $is_admin = $user->getRole() === 'admin';
49 }
50
51 define('IS_ADMIN', $is_admin);
52
53 // si on a un jour besoin d'une variable globale au lieu d'une constante
54 //$GLOBALS['is_admin'] = $is_admin; // version modifiable 1
55 /*function isAdmin(): bool { // version modifiable 2
56 return $_SESSION['user']['role'] ?? null === 'admin';
57 }*/
58
59
60 // => système de cache à ajouter pour ne pas lire la BDD à chaque fois
61 //remplacer ce qui est en haut
62 /*$user = $_SESSION['user'] ?? null;
63 if (!$user) {
64 // visiteur
65 }
66 // Vérification périodique (ex: toutes les 5 minutes)
67 if (time() - $user['last_check'] > 300) {
68 $user = UserController::getUserById($user['id'], $entityManager);
69 if (!$user) {
70 session_destroy();
71 header('Location: /login.php');
72 exit;
73 }
74 // cache pour ne pas avoir à lire la BDD à chaque page
75 $_SESSION['user'] = [
76 'id' => $user['id'],
77 'role' => $user['role'],
78 'username' => $user['username'],
79 'last_check' => time()
80 ];
81 $user = $_SESSION['user'];
82 }
83 $is_admin = ($user['role'] === 'admin');*/
84
85
86 // améliorations possibles: ajouter expiration automatique + protection contre vol de session (IP / user-agent) sans casser ton app.
87}
88
89// nettoyage complet
90/*function cleanSession(){
91 unset($_SESSION['user']); // mémoire vive
92 session_destroy(); // fichier côté serveur
93 setcookie('PHPSESSID', '', time() - 86400, '/'); // cookie de session
94}*/ \ No newline at end of file