@@ -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