一个SSO单点登录实现

看了一遍,基本了解了其原理。要点:
1、首次登陆后的免密登录(如10分钟内)需要服务器识别特定客户端,这需要通过所谓会话(session)机制来实现,具体方式是服务器要能够识别客户端在请求中放入的特定会话标识。对于单个域名来说(如xxx.com)基于cookie的会话保持方式是可以实现的,即服务器查看HTTP请求中的cookie是否正确、是否过期;但如果要实现单点登录场景,往往多个服务器域名不一样,就无法使用同一个cookie来访问不同的域名了(cookie只能针对单个域名),这个时候需要采用另外一种机制来在多服务器之间传递会话信息,即令牌token。
2、单点登录实现令牌的原理简单来说主要有以下几个方面:
1)系统组成:需要有单点登录的认证中心sso-server和在各个服务器上与sso-server通信来验证令牌的sso-client。
2)登录流程:首次客户端浏览器的访问所有系统都会跳转到认证中心进行登录认证,成功或会获取两个东西,一个是认证中心的全局会话id(通常在cookie中的sid字段),另一个是url中的访问令牌,令牌形式往往是URL中?后的一串字符,如http://xxx.com/?ticket=xxx。认证中心在返回令牌后让客户端重定向至需要访问的服务器,服务器会拿到全局令牌向认证中心做验证,成功以后即可基于该令牌建立和客户端的会话sessionid,后续与同一服务器会话均使用sessionid。
3)单点登录:当客户端在首次登录成功后访问其它服务器,流程都是一样的。即先跳转至认证中心,认证中心发现已经有sessionid,则返回待令牌的URL,客户端浏览器按URL跳转至目标服务器,目标服务器与认证中心进行令牌验证,成功后即与浏览器建立会话。
4)注销:当有某一台服务器注销时,服务器会认证中心请求注销,认证中心保存了一个客户端登录的服务器清单,会向所有服务器发送注销请求。

上述方案的好处是:客户端、服务器和认证中心之间完全通过HTTP协议中的cookie机制和302重定向机制即可实现sessionid的校验和ticket的传递。因此只需要基于tomcat等servelet容器来开发就可以了。

单点登录原理及实现参考:https://blog.csdn.net/javaloveiphone/article/details/52439613
cookie格式:https://blog.csdn.net/qq_35574888/article/details/80959449
session实现方式:https://blog.csdn.net/woshinannan741/article/details/72597969

猜你喜欢

转载自blog.csdn.net/qq_36718740/article/details/83785375