成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

全面解析Yii2跨域的SSO登錄邏輯

xingpingz / 2410人閱讀

摘要:簡(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é)與分享,目的就是要把Yii2的SSO登錄功能盡可能的做到極致,從程序開(kāi)發(fā)的靈活性角度去思考問(wèn)題,把一切潛在的局限扼殺在搖籃中。

實(shí)現(xiàn)步驟

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、新建一個(gè)login模塊,然后打開(kāi)commonconfigootstrap.php加下這么一段代碼:

Yii::setAlias("login", dirname(dirname(__DIR__)) . "/login"); //增加自定義目錄結(jié)構(gòu)

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, //設(shè)置有無(wú)‘s’;  
            // "suffix" => ".php",  
            "rules" => [ "" => "site/login",
                        // 如果沒(méi)有這里,則訪問(wèn)域名不能直接打開(kāi)默認(rèn)Action (去除URL的“site/login”) 
            ]   
        ],

4、補(bǔ)充第3步驟缺少的MutilpleDomainUrlManager.php文件
MutilpleDomainUrlManager.php,這個(gè)文件按照我給你們的命名空間存放。

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;
    }
}

注釋?zhuān)河糜讷@取domain url。

5、修改login模塊下的SiteController.php Login方法

    //登錄
    public function actionLogin()
    {    
        //獲取當(dāng)前的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]);
 
        //驗(yàn)證是否已登錄,非為登錄
        if (!Yii::$app->user->isGuest) {  
           if(!empty($redirectURL)){
                $this->actionLogout();//強(qiáng)制性退出登錄
               
                return $this->redirect($URL);

           }else{ 
                //redirectURL不存在時(shí),提交表單判斷
                if($this->siteLogin){     
                   if ($model->load(Yii::$app->request->post()) && $model->login()) { 
                       //判斷該賬號(hào)是否禁止登錄 
                       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存在時(shí),提交表單判斷
            if ($model->load(Yii::$app->request->post()) && $model->login()) {     
                 //判斷該賬號(hào)是否禁止登錄
                 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()
    {  
        //獲取上一個(gè)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標(biāo)簽這么輸出。

注:在其它模塊如:backend、crm等等當(dāng)中仿造我這frontend的實(shí)現(xiàn)思路改改,即可實(shí)現(xiàn)整個(gè)項(xiàng)目的SSO登錄機(jī)制。

提醒注意

1、在第1步驟中,動(dòng)態(tài)獲取無(wú)www的域名,此步驟必須做域名的判斷處理,比如:www.xxx.com,www.xxx.com.cn,www.xxx.com:8099等這些可能出現(xiàn)的域名,以保證域名都能使用實(shí)現(xiàn)登錄退出的機(jī)制。
2、在第5步驟和第7步驟中,使用Yii2自帶的方法Yii::$app->request->getHostInfo().Yii::$app->request->url獲取當(dāng)前的url,是比較方便且高效的一種做法,能降低代碼的冗余。
3、在第6步驟中的frontend模塊下的SiteController.php Login方法里,用Yii2自帶的方法Yii::$app->request->getHostInfo().Yii::$app->user->getReturnUrl()獲取上一個(gè)url,這里必須特別注意是獲取“上一個(gè)url”而不是當(dāng)前的url,獲取當(dāng)前的url就變成了login.xxx.com了,這是不對(duì)的。

相關(guān)資料

Yii: 獲取URL的一些方法:http://blog.csdn.net/iefreer/...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64777.html

相關(guān)文章

  • 全面解析Yii2域的SSO登錄邏輯

    摘要:簡(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
  • 全面解析Yii2域的SSO登錄邏輯

    摘要:簡(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
  • 關(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ā)者反正我是注意到了。...

    Anchorer 評(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)化Yii2域的SSO登錄

    摘要:序言本文主要是對(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)論

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