单点登录方案

单点登录方案

基础:

  1. http连接是无状态的连接
    同一浏览器向服务端发送多次请求,服务器无法识别,哪些请求是同一个浏览器发出的
  2. 为了标识哪些请求是属于同一个浏览器,需要在请求里加一个标识参数
    直接在url或者header加参数,如:accessToken
    http请求时,自动携带浏览器的cookie(对前端开发无知觉),如:jsessionid=abc
  3. 浏览器标识在网络上的传输,是明文的,不安全的
    通过引入HTTPS解决

系统间单点登录

跨系统请求带上用户名密码,比如url或者cookies中。这样不安全。每次都要传输用户名密码提供验证,也可以第一次跨系统访问时带上,目标系统验证成功后写入coodie,后续请求可以不用带上用户名密码。
如果不同平台间有各种的用户权限系统。这么做需要发起请求的平台有目标平台的账号密码。或者目标平台有发起请求平台的账号密码。还有知道目标用户对访问平台具有哪些权限。不同平台间权限对应关系还要梳理清楚。所以更好的方案是统一登录,把用户跟权限提取出来做成sso平台,统一管理各个平台间的权限,或者说统一管理各个平台间的账号权限对应关系。
还有其他的账号同步方案,根据具体需求开发设计。

同域名下单点登录

一个企业一般情况下只有一个域名,通过二级域名区分不同的系统。比如我们有个域名叫做:infotech.vip,同时有两个业务系统分别为:mail.infotech.vip和video.infotech.vip。我们要做单点登录(SSO),需要一个登录系统,叫做:sso.infotech.vip。

在sso.infotech.vip中登录了,会在后台Redis服务器上记录登录信息,同时在浏览器端(Browser)的sso.infotech.vip下写入Cookie。
Cookie是不能跨域的,我们Cookie的domain属性是sso.infotech.vip,在给mail.infotech.vip和video.infotech.vip发送请求是带不上的。

可以将Cookie的域设置为顶域,即infotech.vip,这样所有子域的系统都可以访问到顶域的Cookie。我们在设置Cookie时,只能设置顶域和自己的域,不能设置其他的域。比如:我们不能在自己的系统中给qq.com的域设置Cookie。

不同域名下单点登录CAS

有现成的CAS解决方案。
访问流程:

  1. 访问mail.infotech.vip,判断是否有权限,判断cookies跟ST(Service Ticket)如果没有权限执行步骤2后面操作,如果有权限直接成功访问
  2. 重定向访问sso.infotech.vip,同时参数带上mail.infotech.vip。登录sso服务器。
  3. 登录成功,重定向到mail.infotech.vip同时重定向路径参数上带上ST(Service Ticket)
  4. mail服务器获取ST后访问SSO,验证ST是否有效,验证成功mail服务器将登录状态写入session,并在mail域下写入Cookie后面就可以直接范围mail服务器了

安全网关

在安全网关层做登录权限校验,过滤掉无权限的请求,校验成功的请求中加入用户信息。简化后台程序,后台程序可以不需要做权限校验,直接获取完全网关过滤后的请求中的用户信息。

Auth2.0

具体实现方案

方式一:SSO中心统一管理用户与权限,各个子平台权限都要SSO中心校验

只有一个SSO中心,分别维护各个子系统用户权限

方式二:SSO中心统一管理SSO中心的用户与各个子平台的站号的对应关系

提供SSO查询子系统,获取子系统,新增子系统用户角色功能
提供子系统查询用户对应SSO账号信息功能
统一通过SSO中心进行登录(单点登录,重定向,iframe,子系统间跳转等)

方式三:SSO中心统一管理SSO中心的用户,同步子系统的菜单权限信息

直接通过SSO中心对各个子系统的菜单权限进行分配,子系统登录统一使用SSO中心用户。权限校验统一范围SSO中心进行校验

日志

  1. 提供统一的日志接口给子系统调用,比如一套RestfulAPI或者FTP、SysLog接口、直接数据库
  2. 登录时或者范围子系统时子系统到SSO中心校验并且获取用户信息,根据用户信息进行先对应日志写入操作