单点登录sso 、cookie跨域

setcookie();中的第五个参数是域名参数domain

这个参数如果是.domain.com那么这个cookie可以在主域名或者任意子域名都能够获取。相同域名下。子域名间可以相互共享。但是不相同的域名下不能直接共享。

 

不同(主)域名直接可以通过嵌套的方式生成cookie,通过A域名下的页面嵌套B域名下的连接,从而生成B域名的cookie。但是不能直接相互共享。

嵌套的方式在ie下可能会被阻止,不同的浏览器对第三方生成cookie是有着不同的权限的。因此用到p3p开启ie的权限允许第三方生成cookie

header('P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"');//p3p 

  

sso单点登录

A登录之后,产生一个标示,带着这个标示去访问B(判断是否登录成功),再获取数据。

只要sessionid知道 就可以去找链接池找到登录状态

相同域名下的子域名直接相对简单:

子域名下setcooke.php

<?php 
	//假如登录成功了
	//在子域名下生成一个共享cookie
	$gongxiang = "zhuliuyang";
	
	setcookie("gongxiang",$gongxiang,time()+3600,"/",".cs.com");//设置共享的cookie
	
	session_id($gongxiang);//设置session_id
	session_start();//开启 session
	$_SESSION['isLogin'] = '1';
	
	echo "set success";

  

主域名下判断是否登录

<?php 
if(isset($_COOKIE['gongxiang']) && $_COOKIE['gongxiang']!=false)
{
	session_id($_COOKIE['gongxiang']);//获取共享cookie并设置session_id
}
session_start();//开启session

echo "<pre>";
var_dump($_COOKIE);
var_dump($_SESSION);
echo "</pre>";

?> 

  运行结果:

 

清除cookie之后。是两个空数组。

 

不同主域名下原理也是一样的。前提是在同一服务器上。不在同一服务器上,那么session的连接池就找不到了。

 

对于只允许一个客户端登陆的问题。需要把登陆成功的sessionid存起来,登陆成功之后的sessionid与保存的sessionid 作对比。一样的话则是同一客户端。不一样的话改变登陆状态(改变保存sessionid的登陆状态,强制退出)。

 

在不同的服务器上可以把登录状态存到统一的数据库中或者文件中。再进行判断

 

对于不同的主域名之间的sso登陆:通过url连接的标识到保存登陆状态的服务器去验证登陆状态,返回结果。再取数据

 

 

 

(未完待续)

posted @ 2015-12-01 15:51  到站了  阅读(2698)  评论(0编辑  收藏  举报