摘要:簡述本文章是我對如何實現登錄做一個全面的邏輯解析。提醒注意在第步驟中,動態獲取無的域名,此步驟必須做域名的判斷處理,比如等這些可能出現的域名,以保證域名都能使用實現登錄退出的機制。
簡述
本文章是我對Yii2如何實現SSO登錄做一個全面的邏輯解析。事實上,在此之前我也寫過兩篇文章關于SSO登錄的實現方式以及進一步優化,包括這篇文章也都是介紹Yii2的SSO登錄,逐步優化不斷總結與分享,目的就是要把Yii2的SSO登錄功能盡可能的做到極致,從程序開發的靈活性角度去思考問題,把一切潛在的局限扼殺在搖籃中。
實現步驟1、在commonconfigmain.php文件配置如下:
[ "user" => [ "identityClass" => "loginmodelsUser", "enableAutoLogin" => true, "identityCookie" => ["name" => "_identity", "httpOnly" => true,"domain" => "." . DOMAIN], // "returnUrl"=>"http://" . DOMAIN_HOME, ], "session" => [ "cookieParams" => ["domain" => "." . DOMAIN, "lifetime" => 0], "timeout" => 24*3600*30, ],
2、新建一個login模塊,然后打開commonconfigootstrap.php加下這么一段代碼:
Yii::setAlias("login", dirname(dirname(__DIR__)) . "/login"); //增加自定義目錄結構
3、在loginconfigmain.php里修改 urlManager,改成下面這樣子:
"urlManager" => [ "class" => "commoncomponentsMutilpleDomainUrlManager", "domains" => [ "crm" => "http://" . DOMAIN_CRM, "admin" => "http://" . DOMAIN_ADMIN, "hr" => "http://" . DOMAIN_HR, "oa" => "http://" . DOMAIN_OA, "frontend" => "http://" . DOMAIN_FRONTEND, "backend" => "http://" . DOMAIN_BACKEND, // "img" => "http://" . DOMAIN_IMG, "api" => "http://" . DOMAIN_API, "login" => "http://" . DOMAIN_LOGIN, ], //"baseUrl" => "http://".DOMAIN_LOGIN."?redirectURL=http://".DOMAIN_HOME, "showScriptName" => false, "enablePrettyUrl" => true, //美化URL "enableStrictParsing" => true, //設置有無‘s’; // "suffix" => ".php", "rules" => [ "" => "site/login", // 如果沒有這里,則訪問域名不能直接打開默認Action (去除URL的“site/login”) ] ],
4、補充第3步驟缺少的MutilpleDomainUrlManager.php文件
MutilpleDomainUrlManager.php,這個文件按照我給你們的命名空間存放。
getBaseUrl(); if ($domain) { if (!isset($this->domains[$domain])) { throw new yiiaseInvalidConfigException("Please configure UrlManager of domain "" . $domain . ""."); } $this->setBaseUrl($this->domains[$domain]); } $url = parent::createUrl($params); $this->setBaseUrl($bak); return $url; } }
注釋:用于獲取domain url。
5、修改login模塊下的SiteController.php Login方法
//登錄 public function actionLogin() { //獲取當前的URL $URL=Yii::$app->request->getHostInfo().Yii::$app->request->url; $URL1="http://".DOMAIN_CRM; $redirectURL=Yii::$app->request->get("redirectURL"); $redirectURL1="http://".DOMAIN_LOGIN; $model = new LoginForm(); TagDependency::invalidate(Yii::$app->cache, ["Session:".Yii::$app->session->id]); //驗證是否已登錄,非為登錄 if (!Yii::$app->user->isGuest) { if(!empty($redirectURL)){ $this->actionLogout();//強制性退出登錄 return $this->redirect($URL); }else{ //redirectURL不存在時,提交表單判斷 if($this->siteLogin){ if ($model->load(Yii::$app->request->post()) && $model->login()) { //判斷該賬號是否禁止登錄 if(empty($t_status=$model->user->attributes["t_status"]) && $t_status==0){ return $this->error($redirectURL1,[Yii::t("yii","The account is prohibited from logging in, please contact the administrator!")]); }else{ if(empty($redirectURL)) return $this->redirect($URL1,301); return $this->redirect($redirectURL,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($t_status=$model->user->attributes["t_status"]) && $t_status==0){ if(empty($redirectURL)){ return $this->error($redirectURL1,[Yii::t("yii","The account is prohibited from logging in, please contact the administrator!")]); } return $this->error($URL,[Yii::t("yii","The account is prohibited from logging in, please contact the administrator!")]); }else{ if(empty($redirectURL)) return $this->redirect($URL1,301); return $this->redirect($redirectURL,301); } } else { return $this->renderPartial("login", [ "model" => $model, ]); } } }
6、修改frontend模塊下的SiteController.php Login方法
public function actionLogin() { //獲取上一個URL $URL=Yii::$app->request->getHostInfo().Yii::$app->user->getReturnUrl(); if (!Yii::$app->user->isGuest) { return $this->redirect("http://".DOMAIN_LOGIN."?redirectURL=".$URL); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } else { if(!empty($URL)){ return $this->redirect("http://".DOMAIN_LOGIN."?redirectURL=".$URL); }else{ return $this->renderPartial("login", [ "model" => $model, ]); } } }
7、在frontendviewsdefaultlayoutsmain.php的頂部加入下面代碼
$redirectURL="http://".DOMAIN_LOGIN."?redirectURL=".Yii::$app->request->getHostInfo().Yii::$app->request->url;
8、最后在退出的a標簽這么輸出。
注:在其它模塊如:backend、crm等等當中仿造我這frontend的實現思路改改,即可實現整個項目的SSO登錄機制。
提醒注意1、在第1步驟中,動態獲取無www的域名,此步驟必須做域名的判斷處理,比如:www.xxx.com,www.xxx.com.cn,www.xxx.com:8099等這些可能出現的域名,以保證域名都能使用實現登錄退出的機制。
2、在第5步驟和第7步驟中,使用Yii2自帶的方法Yii::$app->request->getHostInfo().Yii::$app->request->url獲取當前的url,是比較方便且高效的一種做法,能降低代碼的冗余。
3、在第6步驟中的frontend模塊下的SiteController.php Login方法里,用Yii2自帶的方法Yii::$app->request->getHostInfo().Yii::$app->user->getReturnUrl()獲取上一個url,這里必須特別注意是獲取“上一個url”而不是當前的url,獲取當前的url就變成了login.xxx.com了,這是不對的。
Yii: 獲取URL的一些方法:http://blog.csdn.net/iefreer/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21661.html
摘要:簡述本文章是我對如何實現登錄做一個全面的邏輯解析。提醒注意在第步驟中,動態獲取無的域名,此步驟必須做域名的判斷處理,比如等這些可能出現的域名,以保證域名都能使用實現登錄退出的機制。 簡述 本文章是我對Yii2如何實現SSO登錄做一個全面的邏輯解析。事實上,在此之前我也寫過兩篇文章關于SSO登錄的實現方式以及進一步優化,包括這篇文章也都是介紹Yii2的SSO登錄,逐步優化不斷總結與分享,...
摘要:簡述本文章是我對如何實現登錄做一個全面的邏輯解析。提醒注意在第步驟中,動態獲取無的域名,此步驟必須做域名的判斷處理,比如等這些可能出現的域名,以保證域名都能使用實現登錄退出的機制。 簡述 本文章是我對Yii2如何實現SSO登錄做一個全面的邏輯解析。事實上,在此之前我也寫過兩篇文章關于SSO登錄的實現方式以及進一步優化,包括這篇文章也都是介紹Yii2的SSO登錄,逐步優化不斷總結與分享,...
摘要:例如,淘寶登錄的,登錄成功的。所以思考如何實現這種跨域的登錄就顯得尤為重要了。需求分析進入登錄頁面的地址登錄成功后跳轉的地址下面我主要是以框架為例解說一下我是怎么實現這種跨越的登錄的。 序言 近年來網絡發展很快,參與網購的人越來越多,但是大家在網購的時候不知到有沒有注意到無論是淘寶還是京東,他們用的都是二級域名,登錄一個URL,登錄成功后又是一個URL,作為一個開發者反正我是注意到了。...
摘要:例如,淘寶登錄的,登錄成功的。所以思考如何實現這種跨域的登錄就顯得尤為重要了。需求分析進入登錄頁面的地址登錄成功后跳轉的地址下面我主要是以框架為例解說一下我是怎么實現這種跨越的登錄的。 序言 近年來網絡發展很快,參與網購的人越來越多,但是大家在網購的時候不知到有沒有注意到無論是淘寶還是京東,他們用的都是二級域名,登錄一個URL,登錄成功后又是一個URL,作為一個開發者反正我是注意到了。...
摘要:序言本文主要是對關于如何實現跨域的登錄的解析的改進,因為在那篇文章中我已經寫出了登錄的基本實現過程,現在是進一步優化。實現永久登錄狀態。只要不點擊退出登錄,就一直保持著登錄狀態。存在時,提交表單判斷修改的過期時間,設置到極大值。 序言 本文主要是對關于Yii2如何實現跨域的SSO登錄的解析的改進,因為在那篇文章中我已經寫出了SSO登錄的基本實現過程,現在是進一步優化。主要優化的部分有兩...
閱讀 881·2023-04-25 19:17
閱讀 2179·2021-09-10 11:26
閱讀 1898·2019-08-30 15:54
閱讀 3411·2019-08-30 15:53
閱讀 2681·2019-08-30 11:20
閱讀 3392·2019-08-29 15:12
閱讀 1230·2019-08-29 13:16
閱讀 2384·2019-08-26 12:19