有关登录认证机制的探究


从普通的登录认证机制延伸到同域单点登录、跨域单点登录

登录认证机制

普通情形下,浏览器中访问应用时登录,需要我们输入用户名和密码,完成登录认证。这时,我们用户的session信息中标记的登录状态是yes(已登录),同时在浏览器中写入用户的唯一标识——Cookie。
普通登录认证机制
之后再次访问该应用时,请求中会配上这个Cookie,服务端便能够通过这个Cookie找到对应的session,通过session来判断该用户是否已经登录。
(若是不做特殊配置,这个Cookie的名字就叫做jsessionid,值在服务端是唯一的)

同域下的单点登录

在sso.a.com中写下cookie,如何让app1.a.com和app2.a.com登录?

  • cookie不能跨域,cookie的domain属性是sso.a.com,在给app1.a.com和app2.a.com发送请求的过程中是带不上的

    解决cookie的问题:
    SSO登录之后,可以将Cookie的域设置为顶域,也即a.com,这样所有的子域的系统都可以访问到顶域的Cookie

  • sso、app1和app2是不同的应用,他们的session存在于自己的应用中,是不共享的

    解决session的问题:
    把这三个系统实现如下图的Session共享。还有其他共享Session的解决方案,Spring-Session

同域下的单点登录之共享Session
但严格意义上来说,这不属于真正的单点登录

不同域下的单点登录

同域下的可借助于cookie的顶域,但是不同域之间的cookie是不共享的。这时候就需要了解一下单点登录的标准流程——CAS流程

具体流程如下:

  1. 用户访问app系统,app系统是需要登录的,但用户现在没有登录。
  2. 跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。 SSO系统也没有登录,弹出用户登录页。
  3. 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。
  4. SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。
  5. app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。
  6. 验证通过后,app系统将登录状态写入session并设置app域下的Cookie。

至此,跨域单点登录就完成了。以后我们再访问app系统时,app就是登录的。接下来,我们再看看访问app2系统时的流程。

  1. 用户访问app2系统,app2系统没有登录,跳转到SSO。
  2. 由于SSO已经登录了,不需要重新登录认证。
  3. SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。
  4. app2拿到ST,后台访问SSO,验证ST是否有效。
  5. 验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。

这样,app2系统不需要走登录流程,就已经是登录了。SSO,app和app2在不同的域,它们之间的session不共享也是没问题的

总结一下,SSO的特点:

  • 单点登录是保障业务系统的用户资源的安全=
  • 业务系统需要将从SSO拿到的ST去SSO服务器询问是否有效,再决定用户是否可以访问。(用户的账户和密码是提供给SSO服务器的)

Author: Casey Lu
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Casey Lu !
评论
 Previous
轻量级开发的总结 轻量级开发的总结
随着日益增多的应用进入到我们的视野,追求轻量级开发逐渐成为了研发的趋势。 最常见的轻量级的代表便是小程序,可以在避开下载新应用的前提下,呈现在不同的端上。同样是无需下载,主打“一键直达”式的快应用也在去年便出现在人们视野之中。除了以上两者之
2020-08-25
Next 
原生JS实现帧动画 原生JS实现帧动画
所谓帧动画就是在连续的关键帧中分解动画动作,也就是在时间轴的每一帧上面逐帧绘制出不同的内容,使得其能够连续播放而成为动画 常见的帧动画 Gif CSS animation Javascript 前两者实现帧动画存在着不足: 不能灵活
2020-06-26
  TOC