Token.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace laytp\library;
  3. use laytp\library\token\Driver;
  4. use think\facade\Config;
  5. use think\facade\Log;
  6. /**
  7. * Token操作类
  8. */
  9. class Token
  10. {
  11. /**
  12. * @var array Token的实例
  13. */
  14. public static $instance = [];
  15. /**
  16. * @var object 操作句柄
  17. */
  18. public static $handler;
  19. /**
  20. * 连接Token驱动
  21. * @access public
  22. * @param array $options 配置数组
  23. * @param bool|string $name Token连接标识 true 强制重新连接
  24. * @return Driver
  25. */
  26. public static function connect(array $options = [], $name = false)
  27. {
  28. $type = !empty($options['type']) ? $options['type'] : 'File';
  29. if (false === $name) {
  30. $name = md5(serialize($options));
  31. }
  32. if (true === $name || !isset(self::$instance[$name])) {
  33. $class = false === strpos($type, '\\') ?
  34. 'laytp\\library\\token\\driver\\' . ucwords($type) :
  35. $type;
  36. // 记录初始化信息
  37. Config::get('app.app_debug') && Log::record('[ TOKEN ] INIT ' . $type, 'info');
  38. if (true === $name) {
  39. return new $class($options);
  40. }
  41. self::$instance[$name] = new $class($options);
  42. }
  43. return self::$instance[$name];
  44. }
  45. /**
  46. * 自动初始化Token
  47. * @access public
  48. * @param array $options 配置数组
  49. * @return Driver
  50. */
  51. public static function init(array $options = [])
  52. {
  53. if (is_null(self::$handler)) {
  54. if (empty($options) && 'complex' == Config::get('token.type')) {
  55. $default = Config::get('token.default');
  56. // 获取默认Token配置,并连接
  57. $options = Config::get('token.' . $default['type']) ?: $default;
  58. } elseif (empty($options)) {
  59. $options = Config::get('token');
  60. }
  61. self::$handler = self::connect($options);
  62. }
  63. return self::$handler;
  64. }
  65. /**
  66. * 判断Token是否可用(check别名)
  67. * @access public
  68. * @param string $token Token标识
  69. * @param int $userId 用户ID
  70. * @return bool
  71. */
  72. public static function has($token, $userId)
  73. {
  74. return self::check($token, $userId);
  75. }
  76. /**
  77. * 判断Token是否可用
  78. * @param string $token Token标识
  79. * @param int $userId 用户ID
  80. * @return bool
  81. */
  82. public static function check($token, $userId)
  83. {
  84. return self::init()->check($token, $userId);
  85. }
  86. /**
  87. * 读取Token
  88. * @access public
  89. * @param string $token Token标识
  90. * @param mixed $default 默认值
  91. * @return mixed
  92. */
  93. public static function get($token, $default = false)
  94. {
  95. return self::init()->get($token, $default);
  96. }
  97. /**
  98. * 写入Token
  99. * @access public
  100. * @param string $token Token标识
  101. * @param mixed $userId 存储数据
  102. * @param int|null $expire 有效时间 0为永久
  103. * @return boolean
  104. */
  105. public static function set($token, $userId, $expire = null)
  106. {
  107. return self::init()->set($token, $userId, $expire);
  108. }
  109. /**
  110. * 删除Token(delete别名)
  111. * @access public
  112. * @param string $token Token标识
  113. * @return boolean
  114. */
  115. public static function rm($token)
  116. {
  117. return self::delete($token);
  118. }
  119. /**
  120. * 删除Token
  121. * @param string $token 标签名
  122. * @return bool
  123. */
  124. public static function delete($token)
  125. {
  126. return self::init()->delete($token);
  127. }
  128. /**
  129. * 清除Token
  130. * @access public
  131. * @param int $userId Token标记
  132. * @return boolean
  133. */
  134. public static function clear($userId = null)
  135. {
  136. return self::init()->clear($userId);
  137. }
  138. }