/** * 处理用户登录 */ public function actionDoLogin() { header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); $mUserBase = new UserBaseInfo(); $util = Yii::$app->util; $session = Yii::$app->session; $request = Yii::$app->getRequest(); if (!$request->getIsAjax()) { $util->formatResData(1301, 'illegal_request', ['msg' => '非法请求']); } $returnUrl = $session->get('register_returnurl'); $returnUrl = $returnUrl ? rawurldecode($returnUrl) : Url::toRoute(['ucenter/index'], true); $app = Yii::$app->util->judgTransUrl($returnUrl); if (!$app) { $parseUrl = parse_url(Url::toRoute(['ucenter/index'], true)); $app = ApplicationBaseInfo::getByAppUrl($parseUrl['host']); } $post = Yii::$app->request->post(); $post = array_map('htmlEntityString', $post); $post = array_map('trim', $post); $userId = $post['user_id']; $password = $post['password']; $code = $post['code']; // 用户已登录 if ($this->isLogin) { $util->formatResData(0, 'success', ['url' => $returnUrl, 'appCookieUrl' => Url::toRoute(['sso/app-cookie'], true)]); } if ($session['login-fail-count'] >= 3) { $captcha = $this->createAction('captchaUserRegister'); if (!$captcha->validate($code, false)) { $util->formatResData(1201, 'captcha_error', ['msg' => '验证码错误']); } } if (empty($userId) || empty($password)) { $util->formatResData(1401, 'not_empty_error', ['msg' => '账号或密码不能为空']); } $user = $mUserBase->login($userId, $password); // p($user);die; if ($user) { $session->destroy(); $session[UserBaseInfo::SESSION_KEY_USER] = $user; if (isset($session['login-fail-count'])) { unset($session['login-fail-count']); } $cookies = Yii::$app->response->cookies; $times = time() + 60 * 60 * 4; $id = ['name' => UserBaseInfo::COOKIE_KEY_ID, 'value' => $user['id'], 'expire' => $times]; $userId = ['name' => UserBaseInfo::COOKIE_KEY_NAME, 'value' => $user['name'], 'expire' => $times]; $userMobile = ['name' => UserBaseInfo::COOKIE_NAME_PREFIX . 'mobile', 'value' => $user['mobile'], 'expire' => $times]; $userEmail = ['name' => UserBaseInfo::COOKIE_NAME_PREFIX . 'email', 'value' => $user['email'], 'expire' => $times]; $userGender = ['name' => UserBaseInfo::COOKIE_NAME_PREFIX . 'gender', 'value' => $user['gender'], 'expire' => $times]; $avatar = ['name' => 'avatar', 'value' => $user['avatar'], 'expire' => $times]; $openId = ['name' => 'open_id', 'value' => $user['open_id'], 'expire' => $times]; $cookie = ['id' => $id, 'userId' => $userId, 'avatar' => $avatar, 'openId' => $openId, 'mobile' => $userMobile, 'email' => $userEmail, 'gender' => $userGender]; $util->cookie($cookie, $times); $appId = $app['app_id']; $data = ['user_id' => $user['id'], 'login_ip' => Yii::$app->util->getClientIP()]; try { $loginLogModel = Yii::$app->sharding->getModel('UserLoginLog', $appId); $loginLogModel->store($data); } catch (\Exception $res) { echo $res->getMessage(); } $result = ['code' => 0, 'msg' => 'success', 'data' => ['url' => $returnUrl, 'appCookieUrl' => Url::toRoute(['sso/app-cookie'], true)]]; //$util->formatResData(0,'success', ['url' => $returnUrl]); echo json_encode($result); } else { $loginFailCount = $session['login-fail-count']; if (isset($session['login-fail-count'])) { $loginFailCount++; $session['login-fail-count'] = $loginFailCount; } else { $session['login-fail-count'] = 1; } $util = Yii::$app->util; $util->formatResData(1101, 'login_fail', $loginFailCount); } }
/** * 登录设置 * * 主要针对成功登录的用户进行Session、Cookie的设置 * * @param array $user 用户信息 * @param bool $cross_cookie true表示需要JSONP请求 * @return void */ private function _loginSetting($user, $cross_cookie = false) { // SESSION设置 $session = Yii::$app->session; $is_register = $session->get('is_register'); $session->destroy(); $data = ['id' => $user['id'], 'mobile' => $user['mobile'], 'name' => $user['username'], 'email' => $user['email'], 'avatar' => $user['avatar'], 'gender' => $user['gender'], 'open_id' => $user['open_id']]; if ($cross_cookie) { $session['cross_cookie'] = 1; $session['cookie_url'] = Url::toRoute(['sso/app-cookie'], true); } if ($is_register) { $session['is_register'] = $is_register; } $session[self::SESSION_KEY_USER] = $data; // COOKIE设置 $cookies = Yii::$app->response->cookies; $expiredTime = time() + 60 * 60 * 24; unset($data['open_id']); $myCookie = []; foreach ($data as $key => $val) { $myCookie[$key] = ['name' => self::COOKIE_NAME_PREFIX . $key, 'value' => $val]; } /* $myCookie = [ 'id' => [ 'name' => self::COOKIE_KEY_ID, 'value' => $user['id'], ], 'user_id' => [ 'name' => self::COOKIE_KEY_NAME, 'value' => $user['mobile'], ], 'avatar' => [ 'name' => 'avatar', 'value' => $user['avatar'], ], 'open_id' => [ 'name' => 'open_id', 'value' => $user['open_id'], ], ]; */ Yii::$app->util->cookie($myCookie, $expiredTime); $returnUrl = $session->get('register_returnurl'); $returnUrl = $returnUrl ? rawurldecode($returnUrl) : Url::toRoute(['ucenter/index'], true); $app = Yii::$app->util->judgTransUrl($returnUrl); if (!$app) { $app = ApplicationBaseInfo::getByAppUrl(parse_url(Url::toRoute(['ucenter/index'], true))['host']); } $appId = $app['app_id']; $data = ['user_id' => $user['id'], 'login_ip' => Yii::$app->util->getClientIP()]; try { $loginLogModel = Yii::$app->sharding->getModel('UserLoginLog', $appId); $loginLogModel->store($data); } catch (\Exception $res) { echo $res->getMessage(); } }
/** * 判断传递的域名是否满足要求 * * @param string $url 应用传递到数据中心的域名 * @return boolean */ public function judgTransUrl($url, $time = 1800) { if (!($app = Yii::$app->cache->get($url))) { if (!$this->regularUrl($url)) { return false; } $parseUrl = parse_url($url); if (!$parseUrl) { return false; } $appUrl = $parseUrl['host']; if (empty($appUrl)) { return false; } $app = ApplicationBaseInfo::getByAppUrl($appUrl); if (!$app) { return false; } Yii::$app->cache->set($url, $app, $time); } return $app; }