Update Saqel Platform: 2026-08-31 00:19:49
This commit is contained in:
@@ -327,10 +327,10 @@ class AuthController
|
|||||||
// 30 days token expiry
|
// 30 days token expiry
|
||||||
$token = Security::generateJWT($payload, 30 * 86400);
|
$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 {
|
try {
|
||||||
$redis = RedisClient::getInstance();
|
$redis = RedisClient::getInstance();
|
||||||
$sessionKey = "active_session:{$userId}";
|
$sessionKey = "active_session:{$role}:{$userId}";
|
||||||
$redis->setex($sessionKey, 30 * 86400, json_encode([
|
$redis->setex($sessionKey, 30 * 86400, json_encode([
|
||||||
'token_signature' => substr($token, -32),
|
'token_signature' => substr($token, -32),
|
||||||
'device_fingerprint' => $deviceFingerprint,
|
'device_fingerprint' => $deviceFingerprint,
|
||||||
@@ -657,10 +657,12 @@ class AuthController
|
|||||||
public function logout(Request $request, Response $response): void
|
public function logout(Request $request, Response $response): void
|
||||||
{
|
{
|
||||||
$userId = $request->user_id;
|
$userId = $request->user_id;
|
||||||
|
$role = $request->role ?? 'student';
|
||||||
if ($userId) {
|
if ($userId) {
|
||||||
try {
|
try {
|
||||||
$redis = RedisClient::getInstance();
|
$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) {
|
} catch (\Exception $e) {
|
||||||
error_log("Logout Redis error: " . $e->getMessage());
|
error_log("Logout Redis error: " . $e->getMessage());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,11 +36,12 @@ class AuthMiddleware
|
|||||||
}
|
}
|
||||||
|
|
||||||
$userId = (int)$payload['user_id'];
|
$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 {
|
try {
|
||||||
$redis = RedisClient::getInstance();
|
$redis = RedisClient::getInstance();
|
||||||
$sessionData = $redis->get("active_session:{$userId}");
|
$sessionData = $redis->get("active_session:{$role}:{$userId}") ?: $redis->get("active_session:{$userId}");
|
||||||
|
|
||||||
if ($sessionData) {
|
if ($sessionData) {
|
||||||
$session = json_decode($sessionData, true);
|
$session = json_decode($sessionData, true);
|
||||||
|
|||||||
Reference in New Issue
Block a user