首页 > 编程 > PHP > 正文

php如何通过多站点共享seeion实现单点登录(代码示例)

2020-03-22 17:42:43
字体:
来源:转载
供稿:网友

本篇文章给大家带来的内容是关于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已经被存进了数据库中。

相关推荐:

thinkphp 二级域名站点 session共享(单点登录)

php实现web系统单点登录

以上就是php如何通过多站点共享seeion实现单点登录(代码示例)的详细内容,PHP教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表