单点登录实现方案之一

243 阅读4分钟
单点登录专题之一

一.什么是单点登录?

多个系统,只需要一次登录就能访问所有系统,只需要一次退出就能退出所有系统。这就是单点登录。
典型案例:淘宝和天猫。只需要登录其中一个,另一个就无需重复登录。
好处:提高了用户体验。


二.单点登录常见方案:
1. cookie + jsonp
实现跨域
2. session
入库
+ redis(
memcache)
如何选择?
对于需要频繁验证用户登录状态的系统,使用
session+redis
;例如电商系统,典型代表如
taobao.com+tmall.com
对于不需要频繁验证用户是否登录的系统,使用
cookie + jsonp
跨域;例如搜狐旗下的站群系统,典型代表是
sogou.com + 17173.com + focus.cn + chinaren.com


三.cookie + jsonp
方案实现
原理:cookie + jsonp
实现单点登录的原理就是利用
jsonp
实现
cookie
跨域,再细说一下,就是
a
b
c
...
下的登录功能都统一链接到其中一个站点如
a
站下,在这个站点下比对用户名和密码,如果成功就将用户名和密码写入到
a
站下的
cookie
中,然后跳转至
a
站下的
success.php
中间页,在这个中间页中,通过
ajax(dataType='jsonp')
将用户名和密码发送至其他站点下再登录一下,然后写入到其他站点下的
cookie
中,最后跳回至用户想登录的那个站点。具体见下图:


说明:
本次讲解第
1
种方案
(cookie+jsonp)
,下次讲解第
2
种方案
(session+redis)
1.
准备三个域名:
a.com, b.com, c.com
2. 配置三个虚拟主机:


对应地址创建三个站点目录:


3.
添加
host
域名解析:


4.
3
个站点的登录入口统一定位至
a
站下:
http://a.com/login.php
3
个站点的退出入口统一定位至
a
站下:
http://a.com/logout.php
每个站下均设计一个
“我要发帖”
链接,地址为:
http://
网址
/addnews.php
在这个
addnews.php
里检测是否登录,用它来验证单点登录和退出功能是否成功。
现在为每个站点下均创建一个
index.html
页面,这个页面里均含上述三个链接。同时在链接中传递当前的域名,以便在用户登录成功后回跳。
(1) a
站点下的
index.php


(2) b
站点下的
index.php
(3) c
站点下的
index.php


5.
3
个站点的登录入口统一定位至
a
站的
login.php
下,在这个文件中,首先展示用户名和密码提交表单,提交之后比对用户名和密码是否正确,如果正确,就将用户名写入本站的
cookie
中,然后携带用户名和密码跳转到
a
站下的
success
中间页。
其他站点中也有
login.php
,只用来比对通过
ajax
传递过来的用户名和密码。
(1) a.com
下的
login.php:
当用户在任一站点下点击登录时
(
比如
c.com)
,就会链接到
a.com
下的
login
页面,效果如下:


(2) b.com
下的
login.php.(
这个文件暂时还用不着,但是先写好。他是等待来自
success.php
页面发来请求时才用得上
)
(3) c.com
下的
login.php.(
这个文件暂时还用不着,但是先写好。他是等待来自
success.php
页面发来请求时才用得上
)
6.
当用户输入账号密码提交之后,就会进行登录,登录成功之后,跳转至
a
站点下的
success.php
页面,在这个页面中,有三个
input
隐藏域,用来存放用户名、密码和用户想登录的那个站点
(
当然,你不用这种方式也是可以的
)
,然后将用户名和密码通过
jsonp
传递至其他站点下在其他站点下再登录一下,登录成功,就将
cookie
写入对应的站点内。
success.php
文件如下:
7.
如何检测单点登录功能是否成功?当用户在
b.com
下点击登录之后,我们在
c.com
下点击我要发帖功能,如果能提示可以发帖,那就说明单点登录成功了,因为我们在
addnews.php
中检测了是否登录。
addnews.php
代码如下:
(1) a.com
下的
addnews.php:
(2) b.com
下的
addnews.php:
(3) c.com
下的
addnews.php
8.
至此,单点登录已经成功,经验证,确实能实现单点登录功能。单点退出与此类似,读者可自行模仿写出。
9. 待完善之处:用户名和密码在网络中传输最好加密,接收到之后再解密,这样更为安全。