国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

DirtyMind / 676人閱讀

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

相關(guān)資料

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

相關(guān)文章

  • 全面解析Yii2SSO登錄邏輯

    摘要:簡述本文章是我對如何實現(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é)與分享,...

    daryl 評論0 收藏0
  • 全面解析Yii2SSO登錄邏輯

    摘要:簡述本文章是我對如何實現(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é)與分享,...

    2json 評論0 收藏0
  • 全面解析Yii2SSO登錄邏輯

    摘要:簡述本文章是我對如何實現(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é)與分享,...

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

    摘要:例如,淘寶登錄的,登錄成功的。所以思考如何實現(xiàn)這種跨域的登錄就顯得尤為重要了。需求分析進(jìn)入登錄頁面的地址登錄成功后跳轉(zhuǎn)的地址下面我主要是以框架為例解說一下我是怎么實現(xiàn)這種跨越的登錄的。 序言 近年來網(wǎng)絡(luò)發(fā)展很快,參與網(wǎng)購的人越來越多,但是大家在網(wǎng)購的時候不知到有沒有注意到無論是淘寶還是京東,他們用的都是二級域名,登錄一個URL,登錄成功后又是一個URL,作為一個開發(fā)者反正我是注意到了。...

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

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

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

發(fā)表評論

0條評論

DirtyMind

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<