php实现多站点共用session实现单点登录的方法详解
时间:2021-01-22
来源:互联网
这篇文章主要介绍了php实现多站点共用session实现单点登录的方法,结合实例形式详细分析了php多站点共用seeion实现单点登录相关原理及操作注意事项,需要的朋友可以参考下
本文实例讲述了php实现多站点共用session实现单点登录的方法。分享给大家供大家参考,具体如下:
最近闲来无事,总结整理下单点登录的问题。
单点登录的基本原理为:客户端共享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文件如下
//解密$key
decode($key);
//把当前站点的sessionid设置为传递的sessionid
session_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");
以上就是php实现多站点共用session实现单点登录的方法详解的全部内容,希望对你的学习有所帮助。
-
冷钱包是什么?跟热钱包有什么差别?如何选择最安全的存币方式? 时间:2025-04-30
-
什么是欧易Web3钱包?如何创建或导入/管理欧易Web3钱包? 时间:2025-04-30
-
如何通过Gate Web3钱包购买加密货币? 时间:2025-04-30
-
如何从Gate.io转账至Gate Web3钱包?如何将钱包资产转回Gate.io账户? 时间:2025-04-30
-
Gate Web3钱包常见问题汇总 时间:2025-04-30
-
如何使用Gate.io web3钱包进行转账/充值?(App端) 时间:2025-04-30
今日更新
-
原神史莱姆乐园活动地址攻略
阅读:24
-
当手上出现肉眼可见的脏污时最好用什么清洗
阅读:26
-
CF2021年1月新刮刮卡活动地址
阅读:121
-
PHP SESSION跨页面传递失败解决方案
阅读:27
-
PHP使用Session实现上传进度功能详解
阅读:21
-
如何解决PHP获取不到SESSION信息之一般情况
阅读:20
-
PHPcookie与session会话基本用法实例分析
阅读:21
-
PHP实现超简单的SESSION与COOKIE登录验证功能示例
阅读:20
-
PHP图像处理与SESSION制作超简单验证码的方法示例
阅读:26
-
php7 list()、session及其他模块的修改实例分析
阅读:21