data-id="1190000004999380" data-licence="">
序言
本文主要是對「關於Yii2如何實現跨域的SSO登陸的解析」的改進,因為在那篇文章中我已經寫出了SSO登陸的基本實現過程,現在是進一步優化。主要優化的部分有兩點:一、在www.XXX.com登陸狀態的頁面網址列輸入login.XXX.com的時候回到登陸頁面,但並不退出登陸,再輸入www.XXX.com的時候,讓它又回到了www.XXX.com頁面並保持登陸的狀態;二、修改session的過期時間,設定到極大值。
需求分析
1、輸入login.XXX.com只是讓它回到登陸的介面,但並不會退出登陸,session和cookie的值還是保存著的。
2、實現永久登陸狀態。只要不點擊退出登陸,就一直保持登陸狀態。
程式分析
1、對login模組SiteController.php的Login方法修改
1.1、修改前程式碼
<code>public function actionLogin() { $URL=Yii::$app->request->get('redirectURL'); $model = new LoginForm(); if (!\Yii::$app->user->isGuest) { $this->actionLogout();//退出登陆 return $this->redirect('http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_HOME); } if ($model->load(Yii::$app->request->post()) && $model->login()) { if(empty($URL)){ return $this->redirect('http://'.DOMAIN_HOME,301); }else{ return $this->redirect($URL,301); } // return $this->goBack(); } else { return $this->renderPartial('login', [ 'model' => $model, ]); } }</code>
1.2、修改後程式碼
<code> public function actionLogin() { $URL=Yii::$app->request->get('redirectURL'); $URL1='http://'.DOMAIN_CRM; $URL2='http://'.DOMAIN_HR; $URL3='http://'.DOMAIN_ADMIN; $URL4='http://'.DOMAIN_OA; $redirectURL1='http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_CRM; $redirectURL2='http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_HR; $redirectURL3='http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_ADMIN; $redirectURL4='http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_OA; $model = new LoginForm(); //验证是否已登录,非空为登录 if (!\Yii::$app->user->isGuest) { if(!empty($URL)){ $this->actionLogout();//退出登陆 if($URL==$URL2){ return $this->redirect($redirectURL2); }elseif($URL==$URL3){ return $this->redirect($redirectURL3); } if($URL==$URL4){ return $this->redirect($redirectURL4); } return $this->redirect($redirectURL1); }else{ //redirectURL不存在时,提交表单判断 if(DOMAIN_LOGIN){ if ($model->load(Yii::$app->request->post()) && $model->login()) { if(empty($URL)){ return $this->redirect($URL1,301); }else{ if($URL==$URL2){ return $this->redirect($URL2,301); }elseif($URL==$URL3){ return $this->redirect($URL3,301); } if($URL==$URL4){ return $this->redirect($URL4,301); } return $this->redirect($URL1,301); } } else { return $this->renderPartial('login', [ 'model' => $model, ]); } }else{ return $this->goHome(); //与之前的代码主要的区别在这里,登陆就让它回到登陆页面。 } } } else { //redirectURL存在时,提交表单判断 if ($model->load(Yii::$app->request->post()) && $model->login()) { if(empty($URL)){ return $this->redirect($URL1,301); }else{ if($URL==$URL2){ return $this->redirect($URL2,301); }elseif($URL==$URL3){ return $this->redirect($URL3,301); } if($URL==$URL4){ return $this->redirect($URL4,301); } return $this->redirect($URL1,301); } } else { return $this->renderPartial('login', [ 'model' => $model, ]); } } }</code>
2、修改session的過期時間,設定到極大期值。
commonconfigmain.php
2.1、修改前代碼
<code>'session' => [ 'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0], 'timeout' => 3600, ],</code>
2.2、修改後代碼
<code>'session' => [ 'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0], 'timeout' => 7200, ],</code>
常見問題
1、雖然session的過期時間已經設定了極大值,登陸成功cookie也有值了,但是大約有值了,但是登陸後大約有值了,但是大約登陸了過兩個小時左右還是會退出登陸,為何會這樣? Yii2如何實現真正的永久登陸,還請大牛們解答,後續要是我解決了也會繼續更新,一同進步。
相關資料
Yii2 設定 跨網域登入實例:http://www.kuitao8.com/20150507/3735.shtml
Yii2 如何利用redirect讓頁面自動跳到外站? :https://segmentfault.com/q/1010000002549004
全文完,如有不足或更好的方式方法,歡迎大家踴躍提出,我們一起互相交流學習。
以上就介紹了進一步優化Yii2跨域的SSO登陸,包括了sso,yii方面的內容,希望對PHP教程有興趣的朋友有所幫助。