Steuerkram/tests/100_SessionRevocationTest.php
fds2610-bot a95c4efa21 Fix #215: Session deaktivierter/gelöschter Benutzer sofort entziehen
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 11:33:10 +02:00

83 lines
3.4 KiB
PHP

<?php
declare(strict_types=1);
use Steuerkram\Auth;
use Steuerkram\Models\User;
class SessionRevocationTest extends TestCase
{
protected string $testName = 'Test 100: Sitzungsentzug bei Deaktivierung/Löschung/Passwortwechsel (Fix #215)';
public function run(): void
{
User::create('sessionrevoke-user', 'password123');
$user = User::findByUsername('sessionrevoke-user');
$id = (int)$user['id'];
$fingerprint = Auth::passwordFingerprint((string)$user['password_hash']);
$this->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'
);
}
}