php如何通過多網站共用seeion實現單點登入(程式碼範例)

來源:互聯網
上載者:User

本篇文章給大家帶來的內容是關於php如何通過共用seeion實現單點登入(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。

最近閑來無事,總結整理下單點登入的問題。

單點登入的基本原理為:用戶端共用sesionid,伺服器端共用session資訊。通過共同的sessionid在伺服器端獲得相同session資訊,即可達到單點登入(即多網站共用使用者資訊,一處登入,處處可用)的目的。

單點登入分為兩種情況:

一、網站部署在同一個伺服器,且使用同一個次層網域

這種情況下,比較好解決。

1、首先解決網站在用戶端sessionid(存在cookie中)的共用問題。使用ini_set()函數即可指定cookie的域,如下:
ini_set('session.cookie_domain', '.xxxx.com');//設定伺服器cookie的域,xxxx為公用次層網域
2、其次解決網站在服務端的session資訊的共用。因為網站在同一個伺服器,所以產生的session檔案是可以公用的,可以直接使用sessionid擷取對應的session資訊。

二、網站部署在不同的伺服器,使用不同網域名稱

這種情況比較複雜,因為網站在不同伺服器使用不同網域名稱,在用戶端不能使用ini_set設定cookie的範圍,在伺服器端也是各自產生自己的session檔案,不能共用,但還是用解決的辦法。

1、首先解決用戶端sessionid同步問題。

假設我們有三個網站,網域名稱分別是aa.com,bb.com,cc.com。我們在aa.com上建立一個共用的登陸入口login.php,三個網站的登陸請求全部跳轉到該頁面。代碼流程如下:

    $back = login($name,$pwd);//執行登陸操作,成功就寫入session    //如果登入成功,進行以下操作流程    if($back){            $sessionid = session_id();                    $key = encode($session,$keyword);//產生安全碼        //輸出一個登陸成功提示頁,並跳轉到請求登陸的網站    }

在登陸成功html提示頁面中添加如下代碼,利用iframe標籤請求需要同步登陸的網站

aa.com和cc.com網站的set_cookie.php檔案如下

//解密$keydecode($key);//把當前網站的sessionid設定為傳遞的sessionidsession_id($_GET['sessionid']);session_start();
2、解決三個站台伺服器端共用session的問題。

前面已經說過,因為三個網站不在同一個伺服器,因此會產生各自的session檔案,如果想要共用這些檔案,又面臨跨域等一系列問題。所以我們轉化思路,不使用檔案儲存session資訊,而是把session資訊儲存到資料庫中。這樣,只要獲得session資訊的sessionid,任何網站都可以訪問相同的session資訊。

我們建立一個mysql_session.php檔案,用於儲存session資訊到資料庫,代碼如下

$gb_DBname="test";                        //資料庫名稱 $gb_DBuser="root";                        //資料庫使用者名稱稱 $gb_DBpass="";                            //資料庫密碼 $gb_DBHOSTname="127.0.0.1";               //主機的名稱或是IP地址 $SESS_DBH="";                           //資料庫物件session_module_name("User");            //定義session儲存按使用者定義的方式$SESS_LIFE=get_cfg_var("session.gc_maxlifetime");//得到session的最大有效期間,也可以自訂function sess_open($save_path,$session_name){     global $gb_DBHOSTname,$gb_DBname,$gb_DBuser,$gb_DBpass,$SESS_DBH;     if(!$SESS_DBH=mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){     echo "MySql Error:".mysql_error()."";     die();     }     if(!mysql_select_db($gb_DBname,$SESS_DBH)){     echo "MySql Error:".mysql_error()."";     die();     }     return true; } function sess_close(){ return true; } function sess_read($key){     global $SESS_DBH,$SESS_LIFE;     $qry="select value from db_session where sesskey = '$key' and expiry > ".time();     $qid=mysql_query($qry,$SESS_DBH);     if(list($value)=mysql_fetch_row($qid)){     return $value;     }     return false; }//寫入session資訊。儲存session資訊的資料表名為:db_session//除了主鍵自增id,需要的欄位如下//sesskey   sessionid//values    session值//expiry    session的到期日function sess_write($key,$val){     global $SESS_DBH,$SESS_LIFE;     $expiry=time()+$SESS_LIFE;     $value=$val;     $qry="insert into db_session values('$key',$expiry,'$value')";     $qid=mysql_query($qry,$SESS_DBH);     if(!$qid){     $qry="update db_session set expiry=$expiry, value='$value' where sesskey='$key' and expiry >".time();     $qid=mysql_query($qry,$SESS_DBH);     }     return $qid; } function sess_destroy($key){     global $SESS_DBH;     $qry="delete from db_session where sesskey = '$key'";     $qid=mysql_query($qry,$SESS_DBH);     return $qid; } function sess_gc($maxlifetime){     global $SESS_DBH;     $qry="delete from db_session where expiry < ".time();     $qid=mysql_query($qry,$SESS_DBH);     return mysql_affected_rows($SESS_DBH); } session_set_save_handler("sess_open","sess_close","sess_read","sess_write","sess_destroy","sess_gc");

之後在需要使用session的頁面中,在session_start()之前引入該檔案,其他的跟平時使用seesion一樣就可以了。你會發現你賦值的session已經被存進了資料庫中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.