Skip to content

Commit 90c391d

Browse files
committed
fix: reimpostazione token di sessione al logout utente
1 parent ca4280b commit 90c391d

1 file changed

Lines changed: 82 additions & 5 deletions

File tree

src/AuthOSM.php

Lines changed: 82 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class AuthOSM extends Util\Singleton
4747
'code' => 5,
4848
'message' => "L'utente non ha nessun permesso impostato!",
4949
],
50+
'already_logged_in' => [
51+
'code' => 6,
52+
'message' => 'Utente già connesso al gestionale',
53+
],
5054
];
5155

5256
/** @var array Opzioni di sicurezza relative all'hashing delle password */
@@ -131,12 +135,25 @@ public function attempt($username, $password, $force = false)
131135

132136
$status = 'failed';
133137

134-
$users = $database->fetchArray('SELECT id, password, enabled FROM zz_users WHERE username = :username LIMIT 1', [
138+
$users = $database->fetchArray('SELECT id, password, enabled, session_token FROM zz_users WHERE username = :username LIMIT 1', [
135139
':username' => $username,
136140
]);
137141
if (!empty($users)) {
138142
$user = $users[0];
139143

144+
// Verifica se l'utente è già connesso (ha un token di sessione attivo)
145+
if (!empty($user['session_token'])) {
146+
$status = 'already_logged_in';
147+
$this->current_status = $status;
148+
149+
// Log del tentativo
150+
$log['stato'] = self::getStatus()[$status]['code'];
151+
$log['user_agent'] = Filter::getPurifier()->purify($_SERVER['HTTP_USER_AGENT']);
152+
$database->insert('zz_logs', $log);
153+
154+
return false;
155+
}
156+
140157
if (!empty($user['enabled'])) {
141158
$this->identifyUser($user['id']);
142159
$gruppo = Group::join('zz_users', 'zz_users.idgruppo', '=', 'zz_groups.id')->where('zz_users.id', '=', $user['id'])->first();
@@ -279,6 +296,23 @@ public function getToken()
279296
public function destory()
280297
{
281298
if ($this->isAuthenticated() || !empty($_SESSION['id_utente'])) {
299+
// Pulisci il token di sessione dal database
300+
if (!empty($this->user) && !empty($this->user->id)) {
301+
$database = database();
302+
$database->update('zz_users', [
303+
'session_token' => null,
304+
], [
305+
'id' => $this->user->id,
306+
]);
307+
} elseif (!empty($_SESSION['id_utente'])) {
308+
$database = database();
309+
$database->update('zz_users', [
310+
'session_token' => null,
311+
], [
312+
'id' => $_SESSION['id_utente'],
313+
]);
314+
}
315+
282316
$this->user = [];
283317
$this->token_user = null;
284318
$this->first_module = null;
@@ -981,8 +1015,8 @@ protected function saveToSession()
9811015
}
9821016
$_SESSION['id_utente'] = $this->user->id;
9831017

984-
// Salva il token di autenticazione nella sessione
985-
if (!empty($this->user->session_token) && empty($_SESSION['auth_token'])) {
1018+
// Salva il token di autenticazione nella sessione (aggiorna sempre se presente)
1019+
if (!empty($this->user->session_token)) {
9861020
$_SESSION['auth_token'] = $this->user->session_token;
9871021
}
9881022

@@ -1113,17 +1147,60 @@ protected function generateSessionToken($user_id)
11131147
}
11141148
}
11151149

1150+
/**
1151+
* Ricarica l'utente dal database dopo una riconnessione.
1152+
* Questo metodo viene utilizzato per ripristinare lo stato dell'utente
1153+
* quando la connessione al database viene persa e ripristinata.
1154+
*
1155+
* @return bool True se l'utente è stato ricaricato con successo, false altrimenti
1156+
*/
1157+
protected function refreshUser()
1158+
{
1159+
// Verifica se c'è un ID utente nella sessione
1160+
if (empty($_SESSION['id_utente'])) {
1161+
return false;
1162+
}
1163+
1164+
try {
1165+
$database = database();
1166+
1167+
// Verifica che il database sia connesso
1168+
if (!$database->isConnected() || !$database->isInstalled()) {
1169+
return false;
1170+
}
1171+
1172+
// Ricarica l'utente dal database
1173+
$this->identifyUser($_SESSION['id_utente']);
1174+
1175+
// Se l'utente è stato caricato con successo, salva le informazioni nella sessione
1176+
if (!empty($this->user)) {
1177+
$this->saveToSession();
1178+
return true;
1179+
}
1180+
1181+
return false;
1182+
} catch (Exception $e) {
1183+
// In caso di errore, logga il problema e restituisci false
1184+
error_log('Errore durante il refresh dell\'utente: '.$e->getMessage());
1185+
return false;
1186+
}
1187+
}
1188+
11161189
/**
11171190
* Verifica che il token di sessione corrisponda a quello nel database.
11181191
* Permette il login per utenti senza token (periodo di transizione).
1192+
* Gestisce anche il ripristino del token quando la connessione al database viene persa.
11191193
*
11201194
* @return bool True se il token è valido o non presente, false altrimenti
11211195
*/
11221196
protected function checkSessionToken()
11231197
{
1124-
// Se l'utente non è caricato, non possiamo verificare
1198+
// Se l'utente non è caricato, prova a ricaricarlo dalla sessione
11251199
if (empty($this->user)) {
1126-
return false;
1200+
// Prova a ricaricare l'utente dalla sessione (gestisce riconnessione al DB)
1201+
if (!$this->refreshUser()) {
1202+
return false;
1203+
}
11271204
}
11281205

11291206
// Periodo di transizione: se l'utente non ha ancora un token nel DB, permetti l'accesso

0 commit comments

Comments
 (0)