国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > CMS > Discuz > 正文

yii與discuz ucenter實現同步登陸

2024-09-11 09:03:24
字體:
來源:轉載
供稿:網友

上面我們說過yii與discuz實現的通信,這里我們去研究下如何實現同步登陸,注冊,退出

說明:yii于discuz同步的前提有以下幾點:

當前主網站也discuz必須是新網站.

原因:根據ucenter提供的同步登陸方法uc_user_synlogin這里僅支持用戶的id,我們查看 表:前綴_members時,發現該表中只有用戶id即uid為主鍵的,ucenter不提供用戶名同步登陸方法,所以主網站和discuz必須是新的,如果不是新的,比如:主網站已經有部分用戶了,而論壇是后期上的,就會出現一系列問題,比如主網站登陸的時候需要先檢測論壇是否存在這個用戶,如果不存在這個用戶還需要先添加到論壇中,但是添加的時候,是需要uid,這里為了保證一致性,我設定的主網站id即為表前綴_members表中的uid,否則檢測不到數據,如果是先有論壇后有網站等也會出現一系列問題,這里就不做說明.

下面的代碼實例均是網站是新網站,discuz 論壇也是新的即,數據庫都是清空狀態.

登陸(yii系統自帶登陸方法):

1、找到,目錄:protected/controller/SiteController.php

找到actionLogin這個方法,具體代碼如下,覆蓋即可:

  1. public function actionLogin() 
  2.     { 
  3.         $model = new LoginForm; 
  4.         if(isset($_POST['ajax']) && $_POST['ajax']==='login-form'
  5.         { 
  6.             echo CActiveForm::validate($model); 
  7.             Yii::app()->end(); 
  8.         } 
  9.         if(isset($_POST['LoginForm'])) 
  10.         { 
  11.             $model->attributes=$_POST['LoginForm']; 
  12.             if($model->validate() && $model->login()){ 
  13.                 Yii::import('application.vendor.ucenter.*');//引入文件夾 
  14.                 include_once 'ucenter.php'//引入文件 
  15.                 $script = uc_user_synlogin(Yii::app()->user->id);  //調用ucenter的通信代碼,大家可以去追蹤下代碼,最后追蹤到的代碼uc_server/control/user.php這里么,在這個函數中onsynlogin。我們可以看到最終返回的是引入的js文件,但是這里如果你打印或者輸出來$script是不顯示的,因為瀏覽器已經給轉義了,你可以查看源碼,即可看到js引入。 
  16.                 echo "$script";//這里的echo是執行$script,如果你不寫執行則不會觸發這個$script;有好多地方這里寫的是$this->redirect("要跳轉的路徑");。但是我這樣寫的時候出現了問題,因為,上面的echo $script畢竟是js代碼,執行沒有$this->redirect的速度快,所以優先執行了這個,導致不能同步登陸。所以這里改成下面這種寫法,畢竟都是js,所以優先執行了上面的js引入。 
  17.                 echo '《script type="text/javascript">window.location.href="'.Yii::app()->user->returnUrl.'";《/script>'
  18.                 Yii::app()->end();//終止程序,類似于exit 或者dir(); 
  19.             } //Vevb.com 
  20.         } 
  21.         $this->render('login',array('model'=>$model)); 
  22.     } 

登陸(自定義登陸方法且是ajax情況,這個情況比較復雜),其他代碼都一樣,這里僅貼出主要代碼.

  1. //這里省略了ajax傳入這個頁面判定用戶信息是否是我們需要的用戶信息,且當前主網站有這個用戶 
  2.               Yii::import('application.vendor.*'); 
  3.                include_once 'ucenter.php'
  4.                $script = uc_user_synlogin($oneUser->id);  //這里已經拿到js代碼了,但是沒法執行里面的代碼,不能像上面呢樣直接輸出,直接輸出我這里不能執行。 
  5.                $matches = ''
  6.                $pattern =''
  7.                preg_match($pattern,$script,$matches); 
  8.                $url = $matches[1];//這里將src中的地址拿出來 
  9.                header("location:$url");//用header跳轉執行,我使用curl的時候也不能執行,暫時不知道是啥原因 
  10.                echo 1;//這里好像還必須輸出任意東西,不然還會出現一系列問題。但是理論上,上面的header已經跳走了,下面的echo 1應該是不執行的。確實是不執行的但是還必須有,這里就先不糾結了。 

退出:

1、退出沒有實際的什么難點,主要還是和上面以上php比js優先執行的問題,注意這點就可以了,下面是實際代碼:

  1. public function actionLogout() 
  2.     { 
  3.         Yii::app()->user->logout(); 
  4.         Yii::import('application.vendor.*'); 
  5.         include_once 'ucenter.php'
  6.         $script = uc_user_synlogout(); 
  7.         echo $script
  8.  
  9.         Yii::app()->end(); 
  10.     }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳西县| 宾阳县| 广河县| 南宫市| 承德市| 阿坝| 东乌| 青海省| 出国| 蓬溪县| 达拉特旗| 临夏市| 平和县| 扶沟县| 五莲县| 康乐县| 钟祥市| 涡阳县| 清丰县| 青阳县| 阳高县| 普兰县| 济源市| 玉龙| 伽师县| 南岸区| 兴和县| 车险| 厦门市| 竹溪县| 开阳县| 德阳市| 琼海市| 濮阳县| 山阴县| 灌阳县| 惠东县| 富平县| 黑山县| 托里县| 佛学|