跨二级域单点登录解决方案[php+redis]

  • 作者:未知
  • 来源:开源中国
  • 2018-03-05 01:18:54

摘要: 先讲一下跨二级域的sso单点登录的实现原理,后期再做跨一级域

cookie共享 + session共享

cookie共享:共享同一个session cookie,服务端接受到相同的session id

session共享:共享同一个session系统,这样来自不同二级域的统一session id访问同一会话数据

1 (70).jpg

需求分析

web2.0时代,富web应用层出不穷,新公司如雨后春笋般层出不穷,有的专攻一点,有的涵盖广泛,各有各的方向,各有各的理念,嗯,专攻一点的可以狗带了,我们这里主要讲一下涵盖广泛型的web服务最基本的业务整合模式:单点登录

例如开源中国旗下的三个业务单元,主站,个人空间,众包

www.oschina.net my.oschina.netzb.oschina.net

在任何一个站点登录后其他站点都是登录状态

php+redis实现

接下来我们使用php + redis来实现sso的二级跨域模式,如何安装redis服务器和php的redis.so扩展这里就不说了,请自行百度

例如我们有

www.sso.com

my.sso.com

设定session的句柄为redis服务器,session的cookie的共同的域为一级父域 :‘.sso.com’

<?php error_reporting(E_ALL); //session的句柄设为redis ini_set('session.save_handler','redis'); //session的保存路径设为redis服务器的tcp链接 ini_set('session.save_path','tcp://your.redisserver.domian:6379'); //使用session_set_cookie_params来设置session_start()时 //在客户端当前域下保存的session的cookie标识的生存时间,路径,域 session_set_cookie_params(3600,'/','.mysso.com'); //开启session时,session会在客户端需找当前同源域下的键名为session_name()的cookie //此cookie存储着session_id()的值,服务器根据此标示来识别那条session记录时当前客户端的 //若不存在会按session_set_cookie_params给定的参数设定一条cookie在本地 session_start();

逻辑模块,例如:

if(isset($_SESSION['user'])){ echo"welcome!".$_SESSION['user'].'<br/>'; //这里讲明下redis是如何存放session的 $redis=newRedis(); $redis->connect('your.redisserver.domian',6379); //PHPREDIS_SESSION:session_id()的组合键为键名,以string类型存放在redis服务器中 $session=$redis->get('PHPREDIS_SESSION:'.session_id()); var_dump($session); }else{ if(isset($_POST['submit'])){ $_SESSION['user]=$_POST['user]; $_SESSION['password']=$_POST['password']; header("location:/"); }else{?> <!DOCTYPEhtml> <html> <head> <title>sso_redis</title> </head> <body> <div> <formaction="<?phpecho$_SERVER['PHP_SELF']?>"method="post"> <inputtype="text"name="user"/> <inputtype="password"name="password"/> <inputtype="submit"name="submit"value="submit"> </form> </div> </body> </html> <?php }//endpostif }//enduserif ?>

 

以上两个模块分别实现了

session通过redis实现共享,session的cookie域的设置

判断用户是否登录,redis如何保存session

的功能

将以上代码放置到www.sso.commy.sso.com 上(用虚拟主机玩就可以)

在任意站点登录后都可以实现另一站点的登录

父域相同

redis端以String类型存储某session_id的内容

请勿转载!!!!

免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

免费咨询获取折扣