前面做了一个新项目,需要用户资源可以需要共享。由于之前没有做过这样的东西,回家之后,立马网站百度“单点登录”。帖子很多,甄别之后,这里列几篇认为比较有营养。

  http://blog.csdn.net/ghsau/article/details/20545513,http://blog.sina.com.cn/s/blog_5f66526e0102vf43.html

  如果要解决两个网站之间的同步登录(单点登录)问题,首先来看看一个网站的登录问题。

  很多人知道一个网站的登录问题,PHP不就是把通过$_SESSION['user']=array('username'=>'user1');那么,看看php的一句代码,做了那些操作。以windows下wamp环境配合php的配置文件php.ini看瞧瞧session的相关知识?

  php中默认提供session处理方案,可以在php.ini配置文件中看到有这么两行,

  session.save_handler=file

  session.save_path = "E:/wamp/tmp",如下图

  

  这两句告诉我们,在php中session的处理是文件files的方式,存储的地方是E:/wamp/tmp,看看我的文件目录下去

  

  好啦,这就是传说中的session,看得着,点得鸟。可以用记事本打开下,可以看到是一些字符,这是php对象数组序列化之后的字符串。就是把session对象序列化之后,写到文件中,达到session的持久化。如果采用默认配置的话,多个网站的session文件都是存在一个地方的。也就是说,如果同一台服务器中,有两个网站,网站a和网站b的session文件都会存储在一个地方,session文件都有自己的唯一标示符,sessionID。sessionID的生成,sessionID是唯一的,这个sessionID跟session的持久化文件名称是对应的。php通过sessionID去获取session文件,反序列化出来,就能达到session读取的功能了。这样的话,会不会想到,如果两个sessionID相同的话,用户在网站a登录了,用户在去访问网站b的时候,如果sessionID相同,就是已经的登录的状态了。

  解决:两个网站sessionID相同思路

  php提供了session_id()这个函数可以获取到sessionID,可以设置sessionID。在原生PHP中,能实现通过session_id()去修改sessionID,在一些框架中比较难实现,需要深究框架代码,为何难实现呢,这里要了解session_id()和session_start()一些关联了,需要先设定sessionID之后,再去session_start()。所以在框架中,会自动的启用session_start(),所以在启动之后再去修改,sessionID未被修改。

  sessionID相同的还有一种方式,就是浏览器修改sessionID,sessionID是存储在cookie中,在配置文件中,可以看到session.name = PHPSESSID,那么这个PHPSESSID就是sessionID在cookie中的name了。如下图

  

  浏览器和服务器之间每次交互,这个cookie值都会传递给服务器,所以如果我们前台去修改这个值的话,就可以让两个网站公用一个sessionID的值了。

  具体实施:在网站b所有的页面用户加载的时候,去请求网站a的一个接口,看看用户是否有登录,如果有的话,就放回sessionID给网站b,网站b接受到sessionID之后,就修改浏览器cookie中的PHPSESSID值。这样网站b的用户再去操作的话,就会发现自己sessionID对应的session文件跟网站a是同一个,从而达到同步登录。

  网站b代码需要做的就是页面每次访问都需要去请求a网站的数据判断用户是否在a网站登录。

  

<if condition="!session('?member')">
<!--未登录-->
<script type="text/javascript">
function setCookie(name,value)
{
document.cookie = name + "="+ escape (value)+";path=/";
}
//jsonp登录函数
function jsonp_do(data)
{
//log('');
}
<{~$t=time()}>
$(document).ready(function(){
$.ajax({
type:'get',
url:"<{:C('SSO_Site')}>?_ts=<{$t}>&_token=<{:md5($t.C('SecretKey'))}>",
dataType:'jsonp',
crossDomain: true,
jsonp: "callback",
jsonpCallback:'jsonp_do',
success:function(data){
if(data.error==0){
setCookie('PHPSESSID',data.sess_id);
}
},
error: function(XHR, textStatus, errorThrown){
//log
}
});
});
</script>
</if>

  那么网站a就要给出对应的页面来给网站b请求且返回数据。

  

/**
* [index 用户登录]
* @Author:wty
* @DateTime:2016年12月12日11:22:02
* @return [type] [description]
*/
public function index()
{
//可以适当加入用户ip作为加密因子和浏览器因数
$token=I('get._token');//加密串
$timespan=I('get._ts');//时间时间戳
$referer=$_SERVER['HTTP_REFERER'];//这里可以限定安全网址
$error=100;
//这里需要配置
$allow=C('Allow_Site');
if(in_array($referer,$allow)){//如果是在允许访问列表里面
$error=1;
if($token&&$timespan){
$error=2;
$secretKey=C('SecretKey');//秘钥
$check=md5($timespan.$secretKey);
if($check==$token){
$error=3;
if(session('?member')){
$error=0;
$return=array('error'=>0,'username'=>session('member.username'),'sess_id'=>session_id());
echo 'jsonp_do('.json_encode($return).')';
exit;
}
}
}
}
echo 'jsonp_do('.json_encode(array('error'=>$error)).')';
}

 现在多数网站都会采用到负载均衡多服务器,如果是多服务器的话,session的存储可以考虑的memcached或者redis中,上面说道php对于session的默认存储方式是files,如果用memcached的话,就要修改配置文件php.ini

session.save_handler=memcached

 session.save_path = "tpc://192.168.1.1"

在save_handler=memcached或者memcache这里,有点区别,如果配置写的是memcached的话,下面的save_path就要写tcp://192.168.1.1:11211,如果是memcache的话,save_path就要填写为192.168.1.1:11211

 差别不大。

至此简单版本的单点登录基本完成了。

 更多原创博客请看个人独立博客:传送门

  

SSO单点登录PHP简单版的更多相关文章

  1. 简单使用redis实现sso单点登录

    前面几篇分享了nosql只mongodb,今天简单分享另一个nosql神兵redis. 主要模仿sso单点登录,将登录人信息写入redis.话不多说,直接上马,驾. /// <summary&g ...

  2. 使用 JSONP 实现简单的 SSO 单点登录

    SSO 即 Single Sign On(单点登录).  一.二级域名之间的单点登录 不需要用到JSONP 或者 p3p 协议,直接使用 COOKIE 就行了,因为顶级域名相同就能实现 COOKIE ...

  3. SSO 单点登录简单流程(cas)

    配置服务端(链接数据库) 第一步: 下载cas-server端,解压开, 将中的解压开,将该包中的内容放入cas文件夹(新建文件夹)中 然后将这个文件夹放入到服务端的服务器(tomcat)中 将解压开 ...

  4. Docker 创建 Crowd3.3.2 以及打通 Jira Software7.12.3和Confluence6.12.2 SSO 单点登录

    目录 目录 1.介绍 1.1.什么是Crowd? 2.Crowd 的官网在哪里? 3.如何下载安装? 4.对 Crowd 进行配置 4.1.破解 Crowd 第一步 4.2.破解 Crowd 第二步, ...

  5. CAS实现SSO单点登录原理

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  6. SSO单点登录之跨域问题

    第一次写博客,与大家共勉. 这里用到的原理其实非常简单,将cookie存在一个公共的站点的页面上就可以了,这里我们管那个站点叫主站S. 先说说所谓的跨域 环境1:a.xxx.com需要跟b.xxx.c ...

  7. cas sso单点登录系列4_cas-server登录页面自定义修改过程(jsp页面修改)

    转:http://blog.csdn.net/ae6623/article/details/8861065 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标:    ...

  8. CAS实现SSO单点登录原理(转)

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  9. Docker 创建 Crucible4.6.1 以及与 Crowd3.3.2 实现 SSO 单点登录

    目录 目录 1.介绍 1.1.什么是 Crucible? 2.Crucible 的官网在哪里? 3.如何下载安装? 4.对 Crucible 进行配置 4.1.破解 Crucible 第一步 4.2. ...

随机推荐

  1. PHP设置http头信息

    <?PHP function https($num) { $http = array ( 100 => "HTTP/1.1 100 Continue", 101 =&g ...

  2. The FastCGI process exited unexpectedly

    ERROR:HTTP Error 500.0 - Internal Server Error D:\Program Files\php\php-cgi.exe - The FastCGI proces ...

  3. struts2注解驱动 零配置

    一.配置web.xml<filter><filter-name>struts2</filter-name><filter-class>org.apach ...

  4. gerrit升级到16.04之后连接不到服务器

    升级到ubuntu-16.04后,发现Git-review代码报错: Unable to negotiate with 10.140.110.77 port 29418: no matching ke ...

  5. PHP自动生成前端的表单框架

    <?php /** * 为当前所在菜单项样式 * @param string $controller_name * @param string $action_name * @param str ...

  6. 【2】python核心编程 第四章-python对象

    1.python对象 所有的Python 对像都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到. 这个值可以被认为是该对象的 ...

  7. STL之二分查找 (Binary search in STL)

    STL之二分查找 (Binary search in STL) Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound ...

  8. 编程修养-C语言篇(二)

    1.版权和版本——————— 好的程序员会给自己的每个函数,每个文件,都注上版权和版本.  对于C/C++的文件,文件头应该有类似这样的注释: /*************************** ...

  9. android继续学习相关

    最近不是很忙,但是慢慢就忘记了学习. 我总是选中了一条路后,怀疑它的正确性.我也知道这不好. 一年前,我买了一个ipad,然后玩app上的游戏,觉得很好玩,而且上面很多都是收费的, 当时就觉得,为什么 ...

  10. Silverlight 结合ArcGis 在地图上画线

    原文 http://www.dotblogs.com.tw/justforgood/archive/2012/05/10/72085.aspx 先来看看完成后的画面,我从桃园画到高雄,再由高雄画到香港 ...