Token.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. namespace addons\qingdongams\library;
  3. use think\App;
  4. use think\Config;
  5. use think\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. '\\addons\\qingdongams\\library\\token\\driver\\' . ucwords($type) :
  35. $type;
  36. // 记录初始化信息
  37. 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. * @return bool
  70. */
  71. public static function has($token, $user_id)
  72. {
  73. return self::check($token, $user_id);
  74. }
  75. /**
  76. * 判断Token是否可用
  77. * @param string $token Token标识
  78. * @return bool
  79. */
  80. public static function check($token, $user_id, $options=[])
  81. {
  82. return self::init($options)->check($token, $user_id);
  83. }
  84. /**
  85. * 读取Token
  86. * @access public
  87. * @param string $token Token标识
  88. * @param mixed $default 默认值
  89. * @return mixed
  90. */
  91. public static function get($token, $default = false, $options=[])
  92. {
  93. return self::init($options)->get($token) ?: $default;
  94. }
  95. /**
  96. * 写入Token
  97. * @access public
  98. * @param string $token Token标识
  99. * @param mixed $user_id 存储数据
  100. * @param int|null $expire 有效时间 0为永久
  101. * @return boolean
  102. */
  103. public static function set($token, $user_id, $expire = null, $options=[])
  104. {
  105. return self::init($options)->set($token, $user_id, $expire);
  106. }
  107. /**
  108. * 删除Token(delete别名)
  109. * @access public
  110. * @param string $token Token标识
  111. * @return boolean
  112. */
  113. public static function rm($token)
  114. {
  115. return self::delete($token);
  116. }
  117. /**
  118. * 删除Token
  119. * @param string $token 标签名
  120. * @return bool
  121. */
  122. public static function delete($token, $options=[])
  123. {
  124. return self::init($options)->delete($token);
  125. }
  126. /**
  127. * 清除Token
  128. * @access public
  129. * @param int user_id 用户编号
  130. * @return boolean
  131. */
  132. public static function clear($user_id = null, $options=[])
  133. {
  134. return self::init($options)->clear($user_id);
  135. }
  136. }