Update Saqel Platform: 2026-08-31 00:19:49

This commit is contained in:
Hamza-Ayed
2026-08-31 00:19:49 +03:00
parent c4c59bc828
commit 4e29915383
2 changed files with 8 additions and 5 deletions
+5 -3
View File
@@ -327,10 +327,10 @@ class AuthController
// 30 days token expiry
$token = Security::generateJWT($payload, 30 * 86400);
// Single Session Enforcement: Store active session in Redis
// Single Session Enforcement: Store active session in Redis (Role-isolated)
try {
$redis = RedisClient::getInstance();
$sessionKey = "active_session:{$userId}";
$sessionKey = "active_session:{$role}:{$userId}";
$redis->setex($sessionKey, 30 * 86400, json_encode([
'token_signature' => substr($token, -32),
'device_fingerprint' => $deviceFingerprint,
@@ -657,10 +657,12 @@ class AuthController
public function logout(Request $request, Response $response): void
{
$userId = $request->user_id;
$role = $request->role ?? 'student';
if ($userId) {
try {
$redis = RedisClient::getInstance();
$redis->del("active_session:{$userId}");
$redis->del("active_session:{$role}:{$userId}");
$redis->del("active_session:{$userId}"); // Clean up legacy key if present
} catch (\Exception $e) {
error_log("Logout Redis error: " . $e->getMessage());
}
+3 -2
View File
@@ -36,11 +36,12 @@ class AuthMiddleware
}
$userId = (int)$payload['user_id'];
$role = (string)($payload['role'] ?? 'student');
// Check if session is active in Redis (Single Active Device / Session Tracking)
// Check if session is active in Redis (Role-isolated single active session tracking)
try {
$redis = RedisClient::getInstance();
$sessionData = $redis->get("active_session:{$userId}");
$sessionData = $redis->get("active_session:{$role}:{$userId}") ?: $redis->get("active_session:{$userId}");
if ($sessionData) {
$session = json_decode($sessionData, true);