单点登录实现方案与流程

单点登录

再次之前要记录一下另一种形式,单个账号同时只能有一个用户登录,之前在乐望做开发的时候,每个账号的后台登录都只能一个人:

  1. 首先是把session存到redis而非服务器文件,登录后把session_id存到mysql某个字段
  2. 验证用户名密码登录后,取出mysql的session_id字段,然后删除redis下该session_id的key-value。这样就做到上一个登录的人,无法找到对应的session,也就是退出。然后把新的session_id更新到mysql相应的字段
单点登录(single sign on 简称SSO)

单点登录是指在多系统应用群中的一个登录系统,只要在系统应用群中登录一个,便可以在其他系统中得到授权而无需登录

相比于单系统登录,单点登录需要一个独立的认证中心,只有认证中心能接受用户的用户名、密码等信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户名密码没问题,创建授权令牌,然后把令牌作为参数发给各个子系统,子系统拿到了令牌即得到了授权,可以借此创建局部会话,局部会话就与单系统登录相同。这个过程,也就是单点登录的原理。

一、登录

上图中的流程:

  1. 用户访问系统1的受保护资源,系统1发现用户未登录,跳转到sso认证中心,并带上自己的地址作为参数
  2. sso认证发现用户未登录,将用户引导至登录页面
  3. 用户输入用户名、密码提交申请登录
  4. sso认证中心校验用户信息,创建用户与sso之间的会话,并创建令牌
  5. sso认证中心带着令牌跳转到最初的请求地址(系统1)
  6. 系统1拿到令牌,去sso认证中心校验令牌是否有效
  7. sso认证中心校验令牌,返回有效,注册系统1
  8. 系统1使用令牌创建与用户的会话,称为局部会话,返回用户请求的受保护资源
  9. 用户访问系统2的受保护资源,系统2发现用户未登录(第一种猜想通过ip来识别这个用户是否登录,假如发现已经存了这个ip代表已经登录,并返回这个ip对应的令牌;第二种猜想,第一次登录时,sso返回系统1并在客户端存一个cookie,比如tokenid,客户端第二次请求的时候,就会带上这个tokenid,sso就可以识别到底是哪个用户了),跳转至sso认证中心,并附带自己的地址,
  10. sso认证中心发现用户已经登录,返回系统2,并带上令牌。
  11. 系统2拿到令牌,去sso验证令牌是否有效
  12. sso认证令牌,返回有效,并注册系统2
  13. 系统2使用该令牌创建与用户的局部会话,返回用户请求的受保护资源

二、注销

  1. 用户向系统1发起注销请求
  2. 系统1根据用户与系统1建立的会话拿到令牌,向sso认证中心发起注销请求
  3. sso认证令牌有效,销毁全局会话,同时取出所有此令牌注册的系统
  4. sso向所有注册系统发起注销请求
  5. 各注册系统受到sso的注销请求,销毁局部会话
坚持原创技术分享,您的支持将鼓励我继续创作!