UserSession.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace App\Models;
  3. class UserSession extends BaseModel
  4. {
  5. public const IDLE_SECONDS = 86400;
  6. public const LAST_ACTIVITY_SQL = 'CASE WHEN update_time > 0 THEN update_time ELSE create_time END';
  7. protected $table = 'user_session';
  8. protected $fillable = ['user_id', 'token', 'expire_time'];
  9. public $timestamps = true;
  10. protected $dateFormat = 'U'; // U 代表 UNIX 时间戳(int)
  11. // 2. 修改创建时间字段名为 create_time
  12. const CREATED_AT = 'create_time';
  13. const UPDATED_AT = 'update_time';
  14. public static function setToken($userId)
  15. {
  16. $time = now()->getTimestamp();
  17. $userSession = UserSession::where('user_id', $userId)->first();
  18. //获取token延长过期的时间
  19. $expireTime = $time + self::IDLE_SECONDS;
  20. $token = create_token($userId);
  21. //token处理
  22. if ($userSession) {
  23. //重新获取token
  24. $userSession->token = $token;
  25. $userSession->expire_time = $expireTime;
  26. $userSession->update_time = $time;
  27. $userSession->save();
  28. } else {
  29. //找不到在该终端的token记录,创建token记录
  30. $userSession = UserSession::create([
  31. 'user_id' => $userId,
  32. 'token' => $token,
  33. 'expire_time' => $expireTime
  34. ]);
  35. }
  36. return $token;
  37. }
  38. public static function validUntil(array $session): int
  39. {
  40. $lastActivity = (int)($session['update_time'] ?? 0);
  41. if ($lastActivity <= 0) $lastActivity = (int)($session['create_time'] ?? 0);
  42. return $lastActivity > 0 ? min((int)($session['expire_time'] ?? 0), $lastActivity + self::IDLE_SECONDS) : 0;
  43. }
  44. /** Renew only the same still-active token; never move the activity clock backwards. */
  45. public static function renewActiveToken(string $token, int $time, ?int $sessionId = null): ?self
  46. {
  47. if ($token === '') return null;
  48. $sessionId = $sessionId ?? static::where('token', $token)->value('id');
  49. if (!$sessionId) return null;
  50. static::where('id', $sessionId)->where('token', $token)->where('expire_time', '>', $time)
  51. ->whereRaw(self::LAST_ACTIVITY_SQL . ' > (? + 0)', [$time - self::IDLE_SECONDS])
  52. ->whereRaw(self::LAST_ACTIVITY_SQL . ' < (? + 0)', [$time])
  53. ->update(['expire_time' => $time + self::IDLE_SECONDS, 'update_time' => $time]);
  54. $session = static::where('id', $sessionId)->where('token', $token)->where('expire_time', '>', $time)->first();
  55. return $session && self::validUntil($session->getAttributes()) > $time ? $session : null;
  56. }
  57. }