SSO單點登入PHP簡單版

來源:互聯網
上載者:User

標籤:windows   百度   設定檔   

前面做了一個新項目,需要使用者資源可以需要共用。由於之前沒有做過這樣的東西,回家之後,立馬網站百度“單點登入”。文章很多,甄別之後,這裡列幾篇認為比較有營養。

  http://blog.csdn.net/ghsau/article/details/20545513,http://blog.sina.com.cn/s/blog_5f66526e0102vf43.html

  如果要解決兩個網站之間的同步登入(單點登入)問題,首先來看看一個網站的登入問題。

  很多人知道一個網站的登入問題,PHP不就是把通過$_SESSION[‘user‘]=array(‘username‘=>‘user1‘);那麼,看看php的一句代碼,做了那些操作。以windows下wamp環境配合php的設定檔php.ini看瞧瞧session的相關知識?

  php中預設提供session處理方案,可以在php.ini設定檔中看到有這麼兩行,

  session.save_handler=file

  session.save_path = "E:/wamp/tmp",如

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/348680/201701/348680-20170110135108041-47367263.png" style="margin:0px;padding:0px;border:0px;" />

  這兩句告訴我們,在php中session的處理是檔案files的方式,儲存的地方是E:/wamp/tmp,看看我的檔案目錄下去

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/348680/201701/348680-20170110142416588-572642628.png" style="margin:0px;padding:0px;border:0px;" />

  好啦,這就是傳說中的session,看得著,點得鳥。可以用記事本開啟下,可以看到是一些字元,這是php對象數組序列化之後的字串。就是把session對象序列化之後,寫到檔案中,達到session的持久化。如果採用預設配置的話,多個網站的session檔案都是存在一個地方的。也就是說,如果同一台伺服器中,有兩個網站,網站a和網站b的session檔案都會儲存在一個地方,session檔案都有自己的唯一標示符,sessionID。sessionID的產生,sessionID是唯一的,這個sessionID跟session的持久化檔案名稱是對應的。php通過sessionID去擷取session檔案,還原序列化出來,就能達到session讀取的功能了。這樣的話,會不會想到,如果兩個sessionID相同的話,使用者在網站a登入了,使用者在去訪問網站b的時候,如果sessionID相同,就是已經的登入的狀態了。

  解決:兩個網站sessionID相同思路

  php提供了session_id()這個函數可以擷取到sessionID,可以設定sessionID。在原生PHP中,能實現通過session_id()去修改sessionID,在一些架構中比較難實現,需要深究架構代碼,為何難實現呢,這裡要瞭解session_id()和session_start()一些關聯了,需要先設定sessionID之後,再去session_start()。所以在架構中,會自動的啟用session_start(),所以在啟動之後再去修改,sessionID未被修改。

  sessionID相同的還有一種方式,就是瀏覽器修改sessionID,sessionID是儲存在cookie中,在設定檔中,可以看到session.name = PHPSESSID,那麼這個PHPSESSID就是sessionID在cookie中的name了。如

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/348680/201701/348680-20170110161613947-1676322779.png" style="margin:0px;padding:0px;border:0px;" />

  瀏覽器和伺服器之間每次互動,這個cookie值都會傳遞給伺服器,所以如果我們前台去修改這個值的話,就可以讓兩個網站公用一個sessionID的值了。

  具體實施:在網站b所有的頁面使用者載入的時候,去請求網站a的一個介面,看看使用者是否有登入,如果有的話,就放回sessionID給網站b,網站b接受到sessionID之後,就修改瀏覽器cookie中的PHPSESSID值。這樣網站b的使用者再去操作的話,就會發現自己sessionID對應的session檔案跟網站a是同一個,從而達到同步登入。

  網站b代碼需要做的就是頁面每次訪問都需要去請求a網站的資料判斷使用者是否在a網站登入。

  

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

<if condition="!session(‘?member‘)"><!--未登入--><script type="text/javascript">    function setCookie(name,value)    {        document.cookie = name + "="+ escape (value)+";path=/";    }    //jsonp登入函數    function jsonp_do(data)    {      //log(‘‘);    }    <{~$t=time()}>    $(document).ready(function(){      $.ajax({        type:‘get‘,        url:"<{:C(‘SSO_Site‘)}>?_ts=<{$t}>&_token=<{:md5($t.C(‘SecretKey‘))}>",        dataType:‘jsonp‘,        crossDomain: true,        jsonp: "callback",        jsonpCallback:‘jsonp_do‘,        success:function(data){             if(data.error==0){                setCookie(‘PHPSESSID‘,data.sess_id);            }                 },        error: function(XHR, textStatus, errorThrown){            //log        }      });    });</script></if>

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

  那麼網站a就要給出對應的頁面來給網站b請求且返回資料。

  

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

/**     * [index 使用者登入]     * @Author:wty     * @DateTime:2016年12月12日11:22:02     * @return [type] [description]     */    public function index()    {        //可以適當加入使用者ip作為加密因子和瀏覽器因數        $token=I(‘get._token‘);//加密串        $timespan=I(‘get._ts‘);//時間時間戳記        $referer=$_SERVER[‘HTTP_REFERER‘];//這裡可以限定安全網址        $error=100;        //這裡需要配置        $allow=C(‘Allow_Site‘);        if(in_array($referer,$allow)){//如果是在允許訪問列表裡面        $error=1;            if($token&&$timespan){                $error=2;                $secretKey=C(‘SecretKey‘);//秘鑰                $check=md5($timespan.$secretKey);                if($check==$token){                    $error=3;                    if(session(‘?member‘)){                        $error=0;                        $return=array(‘error‘=>0,‘username‘=>session(‘member.username‘),‘sess_id‘=>session_id());                        echo  ‘jsonp_do(‘.json_encode($return).‘)‘;                        exit;                    }                }            }            }        echo  ‘jsonp_do(‘.json_encode(array(‘error‘=>$error)).‘)‘;    }

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

 

 現在多數網站都會採用到負載平衡多伺服器,如果是多伺服器的話,session的儲存可以考慮的memcached或者redis中,上面說道php對於session的預設儲存方式是files,如果用memcached的話,就要修改設定檔php.ini

   session.save_handler=memcached 

 session.save_path = "tpc://192.168.1.1"

   在save_handler=memcached或者memcache這裡,有點區別,如果配置寫的是memcached的話,下面的save_path就要寫tcp://192.168.1.1:11211,如果是memcache的話,save_path就要填寫為192.168.1.1:11211

 差別不大。

   至此簡單版本的單點登入基本完成了。


SSO單點登入PHP簡單版

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.