单点登录实现
个人理解
web系统由单系统发展成多系统组成的应用群,复杂性应该由系统内部承担,而不是用户。无论web系统内部多么复杂,对用户而言,都是一个统一的整体,也就是说,用户访问web系统的整个应用群与访问单个系统一样,登录/注销只要一次就够了
http是无状态的 单个系统我们通常使用cookie来保存用户的身份认证信息。
如果多个系统cookie系统就要部署在一个顶级域名的子域名下
缺点
共享cookie的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。
加一层中间服务层(身份认证中心)
这个时候我们需要做单点登录 为了避免用户在每个站点都要登陆
我们加一层中间层 身份认证中心地址
www.validate.com
比如 新来一个员工 他需要使用到系统a b c
当他第一次登陆 系统a的时候 系统a后台验证是否带有参数token 如果没有带参数token
1.重定向到
www.validate.com
?url=www.testa.com身份认证中心站点
2.验证是否有cookie islogin 如果没有 则跳转到
www.validate.com
/login?url=www.testa.com 并带上当前访问系统的url
3.用户在身份认证中心 输入账号密码提交到后台 验证通过 通过
(1).生成一个token(用于身份认证 比如随机数) 并保存到redis或者其他服务存储
(2).将写入token写入cookie响应给客户端(
注意这个cookie是 验证中心 中间站点发 cookie)
(3).响应重定向到
www.testa.com?token=“????” a获得token 将它写入到自己的域的cookie
(4).系统a 获得token 通过在redis中查找是否存储这个token 如果有 表示登陆成功
4.当这个用户再访问系统b
(1)发现没有带着token 或者token失效 跳转到身份认证中心
www.validate.com
?url=www.testb.com(
注意 之前登陆 我们写入了一个cookie 所以这个cookie会一并提交到身份认证中心)
(2)发现这个用户之前登陆了 并通过cookie 获得token 重定向 到参数url 并带上token
www.testb.com?token='??'
不过现在的很多单点登录 多对应多个终端 cs bs app等 纯web的单点登录 可以参考