摘要:例如,淘寶登錄的,登錄成功的。所以思考如何實現(xiàn)這種跨域的登錄就顯得尤為重要了。需求分析進(jìn)入登錄頁面的地址登錄成功后跳轉(zhuǎn)的地址下面我主要是以框架為例解說一下我是怎么實現(xiàn)這種跨越的登錄的。
序言
近年來網(wǎng)絡(luò)發(fā)展很快,參與網(wǎng)購的人越來越多,但是大家在網(wǎng)購的時候不知到有沒有注意到無論是淘寶還是京東,他們用的都是二級域名,登錄一個URL,登錄成功后又是一個URL,作為一個開發(fā)者反正我是注意到了。
例如,淘寶登錄的URL:https://login.taobao.com/memb...,登錄成功的URL:https://www.taobao.com/?spm=a...。
或許大家可能覺得是多余,我一個URL就能搞定,為什么要整那么多個呢?麻煩。。。
大家可以想象一下,要是不把這兩個模塊分離的話,要是幾千人,幾萬人,甚至上億人同時登錄的話,你就這么個服務(wù)器那不得崩了。所以思考如何實現(xiàn)這種跨域的SSO登錄就顯得尤為重要了。
需求分析1、進(jìn)入登錄頁面的URL地址:login.XXX.com
2、登錄成功后跳轉(zhuǎn)的URL地址:www.XXX.com
下面我主要是以Yii2框架為例解說一下我是怎么實現(xiàn)這種跨越的SSO登錄的。
結(jié)合需求,分布實施:
1、新建一個名為login的模塊
把backend拷貝一份出來,改文件夾的名稱為login,文件夾的名稱改了大家可別忘了也把里邊的文件的命名空間改一下,要不會找不到命名空間。對于多余的文件就把他刪除了,省得占內(nèi)存。至于刪除啥保留啥的,就不詳述了,因為這不是本文的重點,我這么跟你說吧,你需要用的就保留,不需要的通通刪除。
2、寫入配置信息
2.1、在commonconfig頂部加上domain信息,配置以下代碼:
$host_array = explode(".", $_SERVER["HTTP_HOST"]); if (count($host_array) == 3) { define("DOMAIN", $host_array[1] . "." . $host_array[2]); } //針對com.cn域名 elseif (count($host_array) == 4) { define("DOMAIN", $host_array[1] . "." . $host_array[2]. "." . $host_array[3]); }else{ //echo "本系統(tǒng)不支持本地訪問,請配置域名";exit; } // echo "www." . DOMAIN;exit; define("DOMAIN_HOME", "www." . DOMAIN); // define("DOMAIN_API", "api." . DOMAIN); define("DOMAIN_LOGIN", "login." . DOMAIN); // define("DOMAIN_IMG", "img." . DOMAIN);
然后在components里配置User 和 Session:
"user" => [ "identityClass" => "loginmodelsUser", "enableAutoLogin" => true, "identityCookie" => ["name" => "_identity", "httpOnly" => true,"domain" => "." . DOMAIN], // "returnUrl"=>"http://" . DOMAIN_HOME, ], "session" => [ "cookieParams" => ["domain" => "." . DOMAIN, "lifetime" => 0], "timeout" => 3600, ],
以上配置完了之后,打開commonconfigbootstrap.php加下這么一段代碼:
Yii::setAlias("login", dirname(dirname(__DIR__)) . "/login"); //增加自定義目錄結(jié)構(gòu)
2.2、在loginconfig里修改 urlManager,改成下面這樣子:
"urlManager" => [ "class" => "commoncomponentsMutilpleDomainUrlManager", "domains" => [ "backend" => "http://" . DOMAIN_BACKEND, // "mail" => "http://" . DOMAIN_EMAIL, // "img" => "http://" . DOMAIN_IMG, // "api" => "http://" . DOMAIN_API, "login" => "http://" . DOMAIN_LOGIN, ], // "baseUrl" => "http://" . DOMAIN_HOME, # Default BaseUrl "showScriptName" => false, "enablePrettyUrl" => true, //美化URL "enableStrictParsing" => true, //設(shè)置有無‘s’; // "suffix" => ".php", "rules" => [ "" => "site/login", // 如果沒有這里,則訪問域名不能直接打開默認(rèn)Action (去除URL的“site/login”) ] ],
3、新建一個MutilpleDomainUrlManager.php文件
MutilpleDomainUrlManager.php,這個文件按照我給你們的命名空間存放。
namespace commoncomponents; use Yii; class MutilpleDomainUrlManager extends yiiwebUrlManager { public $domains = array(); public function createUrl($domain, $params = array()) { if (func_num_args() === 1) { $params = $domain; $domain = false; } $bak = $this->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
Yii::$app->urlManager->createUrl("site/index"), # www.xxx.com/site/index Yii::$app->urlManager->createUrl("login", "site/login"), # login.xxx.com/site/login Yii::$app->urlManager->createUrl("article/list"), # login.xxx.com/article/list Yii::$app->urlManager->createUrl("man", "user/view"), # man.xxx.com/user/view
4、修改SiteController.php的Login方法
4.1、login模塊
logincontrollersSiteController.php 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, ]); } }
4.2、frontend模塊
frontendcontrollersSiteController.php public function actionLogin() { $URL=Yii::$app->request->get("redirectURL"); //判斷是否已登錄,非為登陸 if (!Yii::$app->user->isGuest) { // return $this->goHome(); $this->actionLogout();//強制性退出 return $this->redirect("http://".DOMAIN_LOGIN."?redirectURL=http://".DOMAIN_HOME); } $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=http://".DOMAIN_HOME); }else{ return $this->renderPartial("login", [ "model" => $model, ]); } } }
5、視圖渲染
5.1在frontendviewslayoutsmain.php的頂部加入紅框的代碼
5.2、最后在退出的a標(biāo)簽這么輸出。
OK,到這里就全部完成了,這時候大家可以測試一下,你會驚奇的發(fā)現(xiàn)Yii2跨域的SSO登錄已經(jīng)實現(xiàn)了。哈哈。。。
常見問題1、手動輸入login.XXX.com進(jìn)入登錄頁面成功了,關(guān)閉瀏覽器后,再重新打開,地址欄輸入www.XXX.com還是登錄狀態(tài)。
解決方式:
在login的方法里邊的驗證是否已登錄調(diào)用“ $this->actionLogout()”退出方法,然后給他個重定向的URL,如:return $this->redirect("http://".DOMAIN_LOGIN."?redirectURL=http://".DOMAIN_ADMIN),這樣就能防止你在地址欄輸入login.XXX.com進(jìn)入到登錄頁面了還退出不成功的問題。
參考代碼: //判斷是否已登錄,非為登陸 if (!Yii::$app->user->isGuest) { $this->actionLogout();//強制性退出 return $this->redirect("http://".DOMAIN_LOGIN."?redirectURL=http://".DOMAIN_ADMIN); }
2、使用Yii::$app->urlManager->createUrl("login", "site/login")這種方式生成
domain url在視圖無法生成的問題,原因是這種方式只能在控制器里面使用。
Yii2 配置 跨域登錄實例:http://www.kuitao8.com/201505...
Yii2 如何利用redirect讓頁面自動跳轉(zhuǎn)到外站?:https://segmentfault.com/q/10...
全文完,如有不足或者更好的方式方法,歡迎大家踴躍提出,我們一起相互交流學(xué)習(xí)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/21464.html
摘要:簡述本文章是我對如何實現(xiàn)登錄做一個全面的邏輯解析。提醒注意在第步驟中,動態(tài)獲取無的域名,此步驟必須做域名的判斷處理,比如等這些可能出現(xiàn)的域名,以保證域名都能使用實現(xiàn)登錄退出的機制。 簡述 本文章是我對Yii2如何實現(xiàn)SSO登錄做一個全面的邏輯解析。事實上,在此之前我也寫過兩篇文章關(guān)于SSO登錄的實現(xiàn)方式以及進(jìn)一步優(yōu)化,包括這篇文章也都是介紹Yii2的SSO登錄,逐步優(yōu)化不斷總結(jié)與分享,...
摘要:簡述本文章是我對如何實現(xiàn)登錄做一個全面的邏輯解析。提醒注意在第步驟中,動態(tài)獲取無的域名,此步驟必須做域名的判斷處理,比如等這些可能出現(xiàn)的域名,以保證域名都能使用實現(xiàn)登錄退出的機制。 簡述 本文章是我對Yii2如何實現(xiàn)SSO登錄做一個全面的邏輯解析。事實上,在此之前我也寫過兩篇文章關(guān)于SSO登錄的實現(xiàn)方式以及進(jìn)一步優(yōu)化,包括這篇文章也都是介紹Yii2的SSO登錄,逐步優(yōu)化不斷總結(jié)與分享,...
摘要:簡述本文章是我對如何實現(xiàn)登錄做一個全面的邏輯解析。提醒注意在第步驟中,動態(tài)獲取無的域名,此步驟必須做域名的判斷處理,比如等這些可能出現(xiàn)的域名,以保證域名都能使用實現(xiàn)登錄退出的機制。 簡述 本文章是我對Yii2如何實現(xiàn)SSO登錄做一個全面的邏輯解析。事實上,在此之前我也寫過兩篇文章關(guān)于SSO登錄的實現(xiàn)方式以及進(jìn)一步優(yōu)化,包括這篇文章也都是介紹Yii2的SSO登錄,逐步優(yōu)化不斷總結(jié)與分享,...
摘要:例如,淘寶登錄的,登錄成功的。所以思考如何實現(xiàn)這種跨域的登錄就顯得尤為重要了。需求分析進(jìn)入登錄頁面的地址登錄成功后跳轉(zhuǎn)的地址下面我主要是以框架為例解說一下我是怎么實現(xiàn)這種跨越的登錄的。 序言 近年來網(wǎng)絡(luò)發(fā)展很快,參與網(wǎng)購的人越來越多,但是大家在網(wǎng)購的時候不知到有沒有注意到無論是淘寶還是京東,他們用的都是二級域名,登錄一個URL,登錄成功后又是一個URL,作為一個開發(fā)者反正我是注意到了。...
摘要:序言本文主要是對關(guān)于如何實現(xiàn)跨域的登錄的解析的改進(jìn),因為在那篇文章中我已經(jīng)寫出了登錄的基本實現(xiàn)過程,現(xiàn)在是進(jìn)一步優(yōu)化。實現(xiàn)永久登錄狀態(tài)。只要不點擊退出登錄,就一直保持著登錄狀態(tài)。存在時,提交表單判斷修改的過期時間,設(shè)置到極大值。 序言 本文主要是對關(guān)于Yii2如何實現(xiàn)跨域的SSO登錄的解析的改進(jìn),因為在那篇文章中我已經(jīng)寫出了SSO登錄的基本實現(xiàn)過程,現(xiàn)在是進(jìn)一步優(yōu)化。主要優(yōu)化的部分有兩...
閱讀 1578·2021-11-25 09:43
閱讀 2482·2019-08-30 15:54
閱讀 2946·2019-08-30 15:53
閱讀 1096·2019-08-30 15:53
閱讀 755·2019-08-30 15:52
閱讀 2545·2019-08-26 13:36
閱讀 814·2019-08-26 12:16
閱讀 1216·2019-08-26 12:13