最近公司需要制作单点登录系统,于是我一直在搜寻各种资料寻找最优化的单点登录制作方式,最后综合了各种想法,完成了单点登录系统,下面给大家分享下,我实现的单点登录的方式:原文转自:http://www.W3PHP.com W3PHP单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。(百度百科)我本人认为单点登录主要解决一下问题:1. 一个用户账号,多站点通用;
2. 一个应用登录,其他应用同时登录;
3. 一个账号退出,其他应用账号同时退出;(非必须,此项不在单点登录的讨论范围之内,不过WEB单点登录,用到的还是挺多的);
4. 欢迎补充PHP实现单点登录方法有多种:1. 通过关系服务 如webservice 之类的;
2. 数据库共享session实现;
4. P3P跨站点 如ucenter phpcms 等;
5. 通过文件操作 SESSIONID
6. 欢迎补充我使用的是第5种方法,下面简单说下实现:一 登陆原理说明我把SSO分为三个角色:1. 客户端 – 指的是用户的浏览器
2. 代理端 – 指的是用户访问的网站;
3. 服务端 - 单点登录服务端,提供用户信息方;同域实现SESSION共享非常容易,但是跨域实现网站和单点登录服务器共享SESSION,就需要做些手脚了;我是这样做的:
二. 过程说明:登陆流程:1. 第一次登陆某个站:a) 站点生成随机字符串TOKEN,保存在cookie中,并携带加密过的APPID,APPKEY  URL跳转到单点登录服务器;单点登录服务器则解密APPID 和APPKEY并去验证站点合法性;同时单点登录服务端会启动SESSION,并根据TOKEN在单点登录服务端的SESSION生成路径,同时生成以TOKEN为文件名的SESSION_TOKEN,把开始启动SESSION的PHPSSID,写入伪SESSION_TOKEN中,实现SESSION共享,然后使客户端跳转至原来的站点URL;a) 用户输入用户名+密码,向用户验证中心发送登录请求b) 当前登录站点,通过CURL请求,用户验证中心验证用户名,密码的合法性。如果验证通过,则返回用户信息,不通过则返回错误信息;c)  根据上一步的CURL请求返回的结果,当前子站对用户进行登陆处理,如果接受到错误,则进行错误处理;2. 登陆状态下,用户转到另一子:a) 通过本站cookie或session验证用户的登录状态:如验证通过,进入正常本站处理程序;不通过则重复第一次登陆步骤;

解决方案 »

  1.   

    如果已登录状态,跳转到另一子站,验证的时候是在url后面加验证信息的吗?
      

  2.   

     根据curl请求验证数据是否正确就行
      

  3.   

    另一子站怎么验证?怎么得到那些验证信息。比如a.xx.com登录了,然后直接在地址上输入b.xx.com,这样可以通过吗?
      

  4.   

    最靠谱的还是想UC那种P3P了吧
      

  5.   

    还有一种更简单的方法,每次登入成功后,生成了token,保存到cookie中,并写入到用户登录信息表里面。第二次登入时,更新token,并写入到数据库。如果之前有人已经登录了,那他从原来的cookie中获取到token,使用这个token到数据库里面查询,这样,就查询不到了(已经被更新),这样程序把他提下线了
      

  6.   

    自己研究模拟登录的资料
    建议思路
    1。下载fiddler 了解http请求。头体
    2.下载一个 snoopy的类。我觉得不错。比curl好。很多空间不支持curl。
    3.看网站登录传入参数服务器响应返回的session--客户端会有个cookies的。 记录有用信息。带到下一个线程内。就可以模拟登录了。浏览需要登录后的网址了基本上都可以搞定。https搞不定
      

  7.   

    比如有1.abc.com和2.abc.com两个子域名,登录服务器为accounts.abc.com,如果在1.abc.com上登录了,在2.abc.com上传什么参数判断是否显示过呢?