首頁 >後端開發 >php教程 >php如何透過多站點共享seeion實現單一登入(程式碼範例)

php如何透過多站點共享seeion實現單一登入(程式碼範例)

不言
不言原創
2018-09-01 09:47:202693瀏覽

這篇文章帶給大家的內容是關於php如何透過分享seeion實現單一登入(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

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

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

單一登入分為兩種情況:

一、網站部署在同一個伺服器,且使用同一個二級網域名稱

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

1、首先解決網站在客戶端sessionid(存在cookie中)的共用問題。使用ini_set()函數即可指定cookie的域,如下:<span style="font-size: 14px;"></span><span style="font-size: 14px;"></span>
#
ini_set(&#39;session.cookie_domain&#39;, &#39;.xxxx.com&#39;);
//设置服务器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標籤請求需要同步登陸的網站
php如何透過多站點共享seeion實現單一登入(程式碼範例)
aa.com和cc.com網站的set_cookie.php檔案如下

//解密
$keydecode($key);
//把当前站点的sessionid设置为传递的sessionid
session_id($_GET[&#39;sessionid&#39;]);
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 = &#39;$key&#39; 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(&#39;$key&#39;,$expiry,&#39;$value&#39;)"; 
    $qid=mysql_query($qry,$SESS_DBH); 
    if(!$qid){ 
    $qry="update db_session set expiry=$expiry, value=&#39;$value&#39; where sesskey=&#39;$key&#39; 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 = &#39;$key&#39;"; 
    $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已經被存進了資料庫中。

相關推薦:

thinkphp 二級網域網站 session共享(單一登入)

php實作web系統單點登入

以上是php如何透過多站點共享seeion實現單一登入(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

相關文章

看更多