博主信息
Whitney的博客
博文
41
粉丝
3
评论
2
访问量
44070
积分:0
P豆:127

PHP单点登录

2020年03月15日 17:32:57阅读数:420博客 / Whitney的博客/ PHP
一、PHP单点登录原理

单点登录的技术实现机制:当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据ticket;用户再访问别的应用的死后,将ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过检验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

可以看出,要实现SSO,需要以下主要的功能:

所有应用系统共享一个身份认证系统;所用应用系统能够识别并提取ticket信息;应用系统能够识别已经登录过的用户,能自动判断当前用户是否已经登录过,从而完成单点登录的功能。 二、PHP单点登录过程登录流程:

1.第一次登录某个网站:

1)用户输入用户名密码,向用户验证中心发送登录请求;

2)当前登录站点,通过webservice请求,验证用户名密码的合法性。如果验证通过,则声称ticket,用于标识当前会话的用户,并将当前登录子站的站点标识符记录到用户中心;最后将获取的用户数据和ticket返回给子站。如果验证不通过,则返回相应的错误状态码;

3)根据上一步的webservice请求返回的结果,当前子站对用户进行登录处理:如状态码表示成功的话,则当前站点通过本站cookie保存ticket,并在本站记录用户的登录状态。状态码表示失败的话,则给用户相应的登录失败提升。

2.登录状态下,用户转到另一子站:

1)通过本站cookie或session验证用户的登录状态:如验证通过,进入正常本站处理程序;否则用户中心验证用户的登录状态(发送ticket至用户验证中心),如验证通过,则对返回的用户信息进行本地的登录处理,否则表明用户为登录。

登出流程:

1)当前登出站清除本站的登录状态和本地保存的用户全站唯一的随机ID;

2)通过webservice接口,清除全站记录的全站唯一的随机ID。webservice接口会返回,登出其他已登录子站的JavaScript代码,本站输出此代码。

3)js代码访问相应网站接口登出脚本;

三、具体实现

1.站点部署在同一个服务器,且使用同一个二级域名

1)首先解决站点在客户端sessionid(存在cookie中)的共享问题。使用ini_set()函数即可指定cookie的域,如下:int_set('session.cookie_domain','.xxxx.com'); //设置服务器cookie的域,xxxx为公用二级域名

2)其次解决站点在服务端的session信息的共享。因为站点在用一服务器,所以生成的session文件是可以公用的,可以直接使用sessionid获取对应的session信息。

2.站点部署在不同的服务器,使用不同域名

1)首先解决客户端sessionid同步问题假设有三个站点,域名分别为aa.com,bb.com,cc.com。在a a.com上建立一个公用的登录入口login.php,三个网站的登录请求皆由此入口进入登录界面;在登录成功html提示页面中增加如下代码,利用iframe标签请求需要同步登录的站点:将返回的ticket同步至子站的cookie中;2)其次解决三个站点服务器端共享session的问题由于三个站点分布在不同的服务器,如果想要共享这些文件,又面临着跨域等一系列问题。所以我们转化思路,不使用文件保存session信息,而是把session信息保存至数据库中,这样只要获得session信息的sessionid,任何站点都可以访问相同的session信息。

参考链接:https://blog.csdn.net/youcijibi/article/details/78351627https://www.jb51.net/article/170272.htm

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
暂无评论暂无评论!