SSO单点登入原理及简单实现

什么是单点登入

SSO(Single Sign On):单点登录是实现多个系统之间统一登录的验证系统,简单来说就是:有A,B,C三个系统,在A处登录过后,再访问B系统,B系统就已经处于了登录状态,C系统也是一样。例如:你同时打开天猫和淘宝,都进入login界面,都要求你登录的,现在你在淘宝处登录后,直接在天猫处刷新,你会发现,你已经登录了,而且就是你在淘宝上登录的用户。说明他们实现了SSO,并且持有相同的信息。
  当然这个特性意味着它的使用场景是:同一公司下的不同子系统,因为对于SSO来说,每一个子系统拥有的信息都一样,是用户的全部信息,如果是不同公司,那这肯定不合适。

为什么使用单点登入

对于传统的单体架构来说,我们是不需要单点登入的,因为只要一个服务器就好了。

但随着企业的发展,一个公司用到的系统随之增多,运营人员在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于运营人员
来说,很不方便。于是,就想到是不是可以在一个系统登录,其他系统就不用登录了呢?这就是单点登录要解决的问题

传统单个服务器我们保持登入的方式很简单:因为http协议是无状态的,所以我们只需要在服务器中通过reqeust.getsession()得到会话状态写到cookie中保存在浏览器就可以保持登入状态了
但是对于下面这样多个系统来说,因为他们是不同域的,所以每次保存的都是是自己域的session,意味着我们即使登入了用户服务器,到相应的商品服务器,还是要重新登入获取新的seesionid,这样多个系统无法实现一次登入到处浪的效果,给用户的体验感不好,所以我们就需要单点登入

SSO单点登入原理及简单实现

单点登入的实现

原理

SSO单点登入原理及简单实现

  1. 访问user.com
  2. 发现未登入,没有局部session
  3. 重定向到认证中心sso.com?url=user.com
  4. 发现没有全局会话session用户信息jessionid
  5. 跳转到SSO登入页面:sso.com/login?url=user.com
  6. 输入用户名密码
  7. 验证用户名密码
  8. 创建全局会话request.getSession();
  9. 创建授权令牌
  10. 跳转到之前要访问的user.com?token=xxxx
  11. 访问sso,带上token和url
  12. 校验令牌的有效性
  13. 令牌有效,跳转到user.com
  14. 创建user.com的局部会话session,登入状态保持/注销
  15. 返回登入成功的页面
  16. 访问order.com
  17. 访问sso检测是否存在sessionid
  18. 有则颁发token并检验toekn有效性跳转order,创建order中的局部session实现免登入,没有则回到5

问题解释

  • 第一次登入完成成功跳转到user.com浏览器共存在几个sessionid?

两个:一个属于sso.com的sessionid,一个属于user.com的sessionid

  • 再次登入是否需要像第一次那样从5步骤开始?

不用,因为第二次已经存在一个sso下的sessionid,所以不用在地登入,只用颁发token即可

  • 如何实现单点注销?

假设从user.com实现注销。因为每次登入都会到认证中心sso,我们则可以在认证中心用一个map维护这么一个登入信息比如:map.put(1,“user.com”);map.put(2,“order.com”),那么过程是:
发起注销——》重定向到sso.com——》j检测当前有多少个子系统——》每个子系统发起注销请求——》调用子系统的注销方法