成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

關(guān)于Yii2如何實(shí)現(xiàn)跨域的SSO登錄的解析

Anchorer / 2887人閱讀

摘要:例如,淘寶登錄的,登錄成功的。所以思考如何實(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)題,原因是這種方式只能在控制器里面使用。

相關(guā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

相關(guān)文章

  • 全面解析Yii2SSO登錄邏輯

    摘要:簡(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é)與分享,...

    daryl 評(píng)論0 收藏0
  • 全面解析Yii2SSO登錄邏輯

    摘要:簡(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é)與分享,...

    2json 評(píng)論0 收藏0
  • 全面解析Yii2SSO登錄邏輯

    摘要:簡(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é)與分享,...

    xingpingz 評(píng)論0 收藏0
  • 關(guān)于Yii2如何實(shí)現(xiàn)SSO登錄解析

    摘要:例如,淘寶登錄的,登錄成功的。所以思考如何實(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ā)者反正我是注意到了。...

    DirtyMind 評(píng)論0 收藏0
  • 進(jìn)一步優(yōu)化Yii2SSO登錄

    摘要:序言本文主要是對(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)化的部分有兩...

    羅志環(huán) 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Anchorer

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<