findModel($user->id, $group); $model->user_id = $user->id; $model->group = $group; $is_multi_terminal_login = Yii::$app->services->setting->mall->get($user->mall_id, "user.is_multi_terminal_login"); // 判断后台设置是否开启多端登录 if (!$is_multi_terminal_login) {// 未开启多端缓存 // 删除缓存 !empty($model->access_token) && Yii::$app->cache->delete($this->getCacheKey($model->access_token)); $model->refresh_token = Yii::$app->security->generateRandomString() . '_' . time(); $model->access_token = Yii::$app->security->generateRandomString() . '_' . time(); } // 字段不存在创建字段token if (!$model->access_token) { $model->refresh_token = Yii::$app->security->generateRandomString() . '_' . time(); $model->access_token = Yii::$app->security->generateRandomString() . '_' . time(); } // 判断缓存key是否还存在 $cache = Yii::$app->cache->get($this->getCacheKey($model->access_token)); if ($this->cache === true && !$cache) { $model->refresh_token = Yii::$app->security->generateRandomString() . '_' . time(); $model->access_token = Yii::$app->security->generateRandomString() . '_' . time(); } // 判断配置文件是否设置缓存验证 if (Yii::$app->params['user.accessTokenValidity'] === true) { $expire = Yii::$app->params['user.accessTokenExpire']; $expire_timestamp = (int)substr($model->access_token, strrpos($model->access_token, '_') + 1) + $expire; //过期时间戳 if ($expire_timestamp <= time()) {// 判断是否过期过期重新生成token $model ->refresh_token = Yii::$app->security->generateRandomString() . '_' . time(); $model->access_token = Yii::$app->security->generateRandomString() . '_' . time(); } } $model->status = StatusEnum::ENABLED; if (!$model->save()) { if ($cycle_index <= 3) { $cycle_index++; return self::getAccessToken($user, $group, $cycle_index); } throw new UnprocessableEntityHttpException('未知错误1'); } $result = []; $result['access_token'] = $model->access_token; $user = ArrayHelper::toArray($user); unset($user['password'],$user['transaction_password'], $user['auth_key'], $user['password_reset_token'], $user['access_token'], $user['refresh_token']); // 写入缓存 $this->cache === true && Yii::$app->cache->set($this->getCacheKey($model->access_token), $model, $this->timeout); return $result; } /** * @param $token * @param $type * @return array|mixed|null|ActiveRecord */ public function getTokenToCache($token, $type, $cache = false) { if ($cache == false && $this->cache == false) { return $this->findByAccessToken($token); } $key = $this->getCacheKey($token); if (!($model = Yii::$app->cache->get($key))) { $model = $this->findByAccessToken($token); Yii::$app->cache->set($key, $model, $this->timeout); } return $model; } /** * 禁用token * * @param $access_token */ public function disableByAccessToken($access_token) { $this->cache === true && Yii::$app->cache->delete($this->getCacheKey($access_token)); if ($model = $this->findByAccessToken($access_token)) { $model->status = StatusEnum::DISABLED; return $model->save(); } return false; } /** * 获取token * * @param $token * @return array|null|ActiveRecord|AccessToken */ public function findByAccessToken($token) { return AccessToken::find() ->where(['access_token' => $token, 'status' => StatusEnum::ENABLED]) ->one(); } /** * @param $access_token * @return string */ public function getCacheKey($access_token) { return RedisKeyEnum::suffix('apiAccessToken') . $access_token; } /** * 返回模型 * @param $user_id * @param $group * @return array|AccessToken|ActiveRecord|null */ protected function findModel($user_id, $group) { if (empty(($model = AccessToken::find()->where([ 'user_id' => $user_id, 'group' => $group ])->one()))) { $model = new AccessToken(); return $model->loadDefaultValues(); } return $model; } /** * 获取用户token * @param $user * @param $group * @return array|mixed * @throws \yii\base\Exception */ public function getUserToken($user,$group) { $user_token = AccessToken::find()->where([ 'user_id' => $user->id, 'group' => $group, ])->one(); $token = []; if($user_token){ $token = $user_token->access_token; if (Yii::$app->params['user.accessTokenValidity'] === true) { $timestamp = (int)substr($token, strrpos($token, '_') + 1); $expire = Yii::$app->params['user.accessTokenExpire']; // 验证有效期 if ($timestamp + $expire <= time()){ $user_token = false; } } $token = ['access_token' => $token]; } if(!$user_token || !$token){ //重新生成 $token = $this->getAccessToken($user,$group); } return $token; } /** * 删除某个站点的所有token缓存 * * @param integer $mall_id * @param string $group * @return void */ public function delAllCacheByMallId(int $mall_id, $group) { $query = User::find()->where(['mall_id' => $mall_id])->select('id'); $user_ids = $query->column(); foreach ($user_ids as $id) { $this->delCacheByUserId($id, $group); } AccessToken::deleteAll(['user_id' => $query]); } /** * 删除某个用户的token缓存 * * @param integer $user_id * @param string $group * @return void */ public function delCacheByUserId(int $user_id, $group) { $model = $this->findModel($user_id, $group); // 删除缓存 !empty($model->access_token) && Yii::$app->cache->delete($this->getCacheKey($model->access_token)); // $model->delete(); } }