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