摘要:例如,淘寶登錄的,登錄成功的。所以思考如何實(shí)現(xiàn)這種跨域的登錄就顯得尤為重要了。需求分析進(jìn)入登錄頁(yè)面的地址登錄成功后跳轉(zhuǎn)的地址下面我主要是以框架為例解說(shuō)一下我是怎么實(shí)現(xiàn)這種跨越的登錄的。
序言
近年來(lái)網(wǎng)絡(luò)發(fā)展很快,參與網(wǎng)購(gòu)的人越來(lái)越多,但是大家在網(wǎng)購(gòu)的時(shí)候不知到有沒(méi)有注意到無(wú)論是淘寶還是京東,他們用的都是二級(jí)域名,登錄一個(gè)URL,登錄成功后又是一個(gè)URL,作為一個(gè)開(kāi)發(fā)者反正我是注意到了。
例如,淘寶登錄的URL:https://login.taobao.com/memb...,登錄成功的URL:https://www.taobao.com/?spm=a...。
或許大家可能覺(jué)得是多余,我一個(gè)URL就能搞定,為什么要整那么多個(gè)呢?麻煩。。。
大家可以想象一下,要是不把這兩個(gè)模塊分離的話(huà),要是幾千人,幾萬(wàn)人,甚至上億人同時(shí)登錄的話(huà),你就這么個(gè)服務(wù)器那不得崩了。所以思考如何實(shí)現(xiàn)這種跨域的SSO登錄就顯得尤為重要了。
需求分析1、進(jìn)入登錄頁(yè)面的URL地址:login.XXX.com
2、登錄成功后跳轉(zhuǎn)的URL地址:www.XXX.com
下面我主要是以Yii2框架為例解說(shuō)一下我是怎么實(shí)現(xiàn)這種跨越的SSO登錄的。
結(jié)合需求,分布實(shí)施:
1、新建一個(gè)名為login的模塊
把backend拷貝一份出來(lái),改文件夾的名稱(chēng)為login,文件夾的名稱(chēng)改了大家可別忘了也把里邊的文件的命名空間改一下,要不會(huì)找不到命名空間。對(duì)于多余的文件就把他刪除了,省得占內(nèi)存。至于刪除啥保留啥的,就不詳述了,因?yàn)檫@不是本文的重點(diǎn),我這么跟你說(shuō)吧,你需要用的就保留,不需要的通通刪除。
2、寫(xiě)入配置信息
2.1、在commonconfig頂部加上domain信息,配置以下代碼:
$host_array = explode(".", $_SERVER["HTTP_HOST"]); if (count($host_array) == 3) { define("DOMAIN", $host_array[1] . "." . $host_array[2]); } //針對(duì)com.cn域名 elseif (count($host_array) == 4) { define("DOMAIN", $host_array[1] . "." . $host_array[2]. "." . $host_array[3]); }else{ //echo "本系統(tǒng)不支持本地訪(fǎng)問(wèn),請(qǐ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, ],
以上配置完了之后,打開(kāi)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è)置有無(wú)‘s’; // "suffix" => ".php", "rules" => [ "" => "site/login", // 如果沒(méi)有這里,則訪(fǎng)問(wèn)域名不能直接打開(kāi)默認(rèn)Action (去除URL的“site/login”) ] ],
3、新建一個(gè)MutilpleDomainUrlManager.php文件
MutilpleDomainUrlManager.php,這個(gè)文件按照我給你們的命名空間存放。
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();//強(qiáng)制性退出 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();//強(qiáng)制性退出 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,到這里就全部完成了,這時(shí)候大家可以測(cè)試一下,你會(huì)驚奇的發(fā)現(xiàn)Yii2跨域的SSO登錄已經(jīng)實(shí)現(xiàn)了。哈哈。。。
常見(jiàn)問(wèn)題1、手動(dòng)輸入login.XXX.com進(jìn)入登錄頁(yè)面成功了,關(guān)閉瀏覽器后,再重新打開(kāi),地址欄輸入www.XXX.com還是登錄狀態(tài)。
解決方式:
在login的方法里邊的驗(yàn)證是否已登錄調(diào)用“ $this->actionLogout()”退出方法,然后給他個(gè)重定向的URL,如:return $this->redirect("http://".DOMAIN_LOGIN."?redirectURL=http://".DOMAIN_ADMIN),這樣就能防止你在地址欄輸入login.XXX.com進(jìn)入到登錄頁(yè)面了還退出不成功的問(wèn)題。
參考代碼: //判斷是否已登錄,非為登陸 if (!Yii::$app->user->isGuest) { $this->actionLogout();//強(qiáng)制性退出 return $this->redirect("http://".DOMAIN_LOGIN."?redirectURL=http://".DOMAIN_ADMIN); }
2、使用Yii::$app->urlManager->createUrl("login", "site/login")這種方式生成
domain url在視圖無(wú)法生成的問(wèn)題,原因是這種方式只能在控制器里面使用。
Yii2 配置 跨域登錄實(shí)例:http://www.kuitao8.com/201505...
Yii2 如何利用redirect讓頁(yè)面自動(dòng)跳轉(zhuǎn)到外站?:https://segmentfault.com/q/10...
全文完,如有不足或者更好的方式方法,歡迎大家踴躍提出,我們一起相互交流學(xué)習(xí)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/78962.html
摘要:簡(jiǎn)述本文章是我對(duì)如何實(shí)現(xiàn)登錄做一個(gè)全面的邏輯解析。提醒注意在第步驟中,動(dòng)態(tài)獲取無(wú)的域名,此步驟必須做域名的判斷處理,比如等這些可能出現(xiàn)的域名,以保證域名都能使用實(shí)現(xiàn)登錄退出的機(jī)制。 簡(jiǎn)述 本文章是我對(duì)Yii2如何實(shí)現(xiàn)SSO登錄做一個(gè)全面的邏輯解析。事實(shí)上,在此之前我也寫(xiě)過(guò)兩篇文章關(guān)于SSO登錄的實(shí)現(xiàn)方式以及進(jìn)一步優(yōu)化,包括這篇文章也都是介紹Yii2的SSO登錄,逐步優(yōu)化不斷總結(jié)與分享,...
摘要:簡(jiǎn)述本文章是我對(duì)如何實(shí)現(xiàn)登錄做一個(gè)全面的邏輯解析。提醒注意在第步驟中,動(dòng)態(tài)獲取無(wú)的域名,此步驟必須做域名的判斷處理,比如等這些可能出現(xiàn)的域名,以保證域名都能使用實(shí)現(xiàn)登錄退出的機(jī)制。 簡(jiǎn)述 本文章是我對(duì)Yii2如何實(shí)現(xiàn)SSO登錄做一個(gè)全面的邏輯解析。事實(shí)上,在此之前我也寫(xiě)過(guò)兩篇文章關(guān)于SSO登錄的實(shí)現(xiàn)方式以及進(jìn)一步優(yōu)化,包括這篇文章也都是介紹Yii2的SSO登錄,逐步優(yōu)化不斷總結(jié)與分享,...
摘要:簡(jiǎn)述本文章是我對(duì)如何實(shí)現(xiàn)登錄做一個(gè)全面的邏輯解析。提醒注意在第步驟中,動(dòng)態(tài)獲取無(wú)的域名,此步驟必須做域名的判斷處理,比如等這些可能出現(xiàn)的域名,以保證域名都能使用實(shí)現(xiàn)登錄退出的機(jī)制。 簡(jiǎn)述 本文章是我對(duì)Yii2如何實(shí)現(xiàn)SSO登錄做一個(gè)全面的邏輯解析。事實(shí)上,在此之前我也寫(xiě)過(guò)兩篇文章關(guān)于SSO登錄的實(shí)現(xiàn)方式以及進(jìn)一步優(yōu)化,包括這篇文章也都是介紹Yii2的SSO登錄,逐步優(yōu)化不斷總結(jié)與分享,...
摘要:例如,淘寶登錄的,登錄成功的。所以思考如何實(shí)現(xiàn)這種跨域的登錄就顯得尤為重要了。需求分析進(jìn)入登錄頁(yè)面的地址登錄成功后跳轉(zhuǎn)的地址下面我主要是以框架為例解說(shuō)一下我是怎么實(shí)現(xiàn)這種跨越的登錄的。 序言 近年來(lái)網(wǎng)絡(luò)發(fā)展很快,參與網(wǎng)購(gòu)的人越來(lái)越多,但是大家在網(wǎng)購(gòu)的時(shí)候不知到有沒(méi)有注意到無(wú)論是淘寶還是京東,他們用的都是二級(jí)域名,登錄一個(gè)URL,登錄成功后又是一個(gè)URL,作為一個(gè)開(kāi)發(fā)者反正我是注意到了。...
摘要:序言本文主要是對(duì)關(guān)于如何實(shí)現(xiàn)跨域的登錄的解析的改進(jìn),因?yàn)樵谀瞧恼轮形乙呀?jīng)寫(xiě)出了登錄的基本實(shí)現(xiàn)過(guò)程,現(xiàn)在是進(jìn)一步優(yōu)化。實(shí)現(xiàn)永久登錄狀態(tài)。只要不點(diǎn)擊退出登錄,就一直保持著登錄狀態(tài)。存在時(shí),提交表單判斷修改的過(guò)期時(shí)間,設(shè)置到極大值。 序言 本文主要是對(duì)關(guān)于Yii2如何實(shí)現(xiàn)跨域的SSO登錄的解析的改進(jìn),因?yàn)樵谀瞧恼轮形乙呀?jīng)寫(xiě)出了SSO登錄的基本實(shí)現(xiàn)過(guò)程,現(xiàn)在是進(jìn)一步優(yōu)化。主要優(yōu)化的部分有兩...
閱讀 1746·2019-08-30 12:51
閱讀 734·2019-08-29 17:30
閱讀 3796·2019-08-29 15:17
閱讀 911·2019-08-28 18:10
閱讀 1461·2019-08-26 17:08
閱讀 2243·2019-08-26 12:16
閱讀 3522·2019-08-26 11:47
閱讀 3570·2019-08-23 16:18