assertEquals( $fingerprint, Auth::passwordFingerprint((string)$user['password_hash']), 'passwordFingerprint() ist deterministisch für denselben Hash' ); $this->assert( $fingerprint !== Auth::passwordFingerprint('$2y$anderer-hash'), 'passwordFingerprint() unterscheidet unterschiedliche Hashes' ); // Frisch angemeldete Session: aktiver Benutzer, passender Fingerprint -> gültig $authData = User::findAuthData($id); $this->assert( !Auth::isSessionRevoked($authData, $fingerprint), 'Aktiver Benutzer mit passendem Passwort-Fingerprint gilt als gültige Session' ); // Fehlender/falscher Fingerprint (z. B. Session von vor dem Fix, oder nach Passwortänderung) $this->assert( Auth::isSessionRevoked($authData, ''), 'Fehlender Passwort-Fingerprint in der Session entzieht den Zugriff' ); $this->assert( Auth::isSessionRevoked($authData, 'falscher-fingerprint'), 'Abweichender Passwort-Fingerprint entzieht den Zugriff' ); // Admin ändert das Passwort -> alter Fingerprint wird ungültig User::update($id, 'sessionrevoke-user', 'einneuespasswort123'); $afterPasswordChange = User::findAuthData($id); $this->assert( Auth::isSessionRevoked($afterPasswordChange, $fingerprint), 'Passwortänderung entzieht bereits bestehende Sessions (alter Fingerprint)' ); $newFingerprint = Auth::passwordFingerprint((string)$afterPasswordChange['password_hash']); $this->assert( !Auth::isSessionRevoked($afterPasswordChange, $newFingerprint), 'Nach der Passwortänderung ist eine Session mit dem neuen Fingerprint wieder gültig' ); // Admin deaktiviert den Benutzer -> Session wird ungültig, obwohl Fingerprint passt User::setActive($id, false); $afterDeactivation = User::findAuthData($id); $this->assert( Auth::isSessionRevoked($afterDeactivation, $newFingerprint), 'Deaktivierung entzieht den Zugriff, obwohl der Passwort-Fingerprint noch passt' ); User::setActive($id, true); $afterReactivation = User::findAuthData($id); $this->assert( !Auth::isSessionRevoked($afterReactivation, $newFingerprint), 'Reaktivierung macht die Session mit passendem Fingerprint wieder gültig' ); // Admin löscht den Benutzer -> Session wird ungültig User::delete($id); $afterDelete = User::findAuthData($id); $this->assert($afterDelete === false, 'Gelöschter Benutzer wird von findAuthData() nicht mehr gefunden'); $this->assert( Auth::isSessionRevoked($afterDelete, $newFingerprint), 'Löschung entzieht den Zugriff' ); } }