单点登录系统的实现1

一、什么是单点登录?

       单点登录的英文名叫做:Single Sign On(简称SSO)。在初学/以前的时候,一般我们就单系统,所有的功能都在同一个系统上。为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统。简单来说,单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。

                           

二、多系统登录的问题 

1. Session不共享问题

       单系统登录功能主要是用Session保存用户信息来实现的,但我们清楚的是:多系统即可能有多个Tomcat,而Session是依赖当前系统的Tomcat,所以系统A的Session和系统B的Session是不共享的。

                                     

解决系统之间Session不共享问题有一下几种方案:

  • Tomcat集群Session全局复制(集群内每个tomcat的session完全同步)【会影响集群的性能呢,不建议】
  • 根据请求的IP进行Hash映射到对应的机器上(这就相当于请求的IP一直会访问同一个服务器)【如果服务器宕机了,会丢失了一大部分Session的数据,不建议】
  • 把Session数据放在Redis中(使用Redis模拟Session)【建议】。将Session存储于Redis上,然后将整个系统的全局Cookie Domain设置于顶级域名上,这样SessionID就能在各个子系统间共享。

2. Cookie跨域的问题

       比如说,我们请求 <https://www.google.com/>时,浏览器会自动把 goolge 的 Cookie 带过去给 google 的服务器,而不会把<https://www.baidu.com/>的 Cookie 带过去给 google 的服务器。这就意味着,由于域名不同,用户向系统A登录后,系统A返回给浏览器的Cookie,用户再请求系统B的时候不会将系统 A 的 Cookie 带过去。

针对Cookie存在跨域问题,有几种解决方案:

  1. 服务端将Cookie写到客户端后,客户端对Cookie进行解析,将Token解析出来,此后请求都把这个Token带上就行了
  2. 多个域名共享Cookie,在写到客户端的时候设置 Cookie 的 domain。
  3. 将 Token 保存在SessionStroage中(不依赖Cookie就没有跨域的问题了)。

3.  CAS原理 (Central Authentication Service)​​​

      如果已经将登录单独抽取成系统出来,我们还能这样玩。现在我们有两个系统,分别是www.java3y.comwww.java4y.com,一个SSO www.sso.com。

                                    

首先,用户想要访问系统A www.java3y.com受限的资源(比如说购物车功能,购物车功能需要登录后才能访问),系统A www.java3y.com发现用户并没有登录,于是重定向到 sso 认证中心,并将自己的地址作为参数。请求的地址如下:

  • www.sso.com?service=www.java3y.com

sso认证中心发现用户未登录,将用户引导至登录页面,用户进行输入用户名和密码进行登录,用户与认证中心建立全局会话(生成一份Token,写到Cookie中,保存在浏览器上)。

                                   

随后,认证中心重定向回系统A,并把Token携带过去给系统A,重定向的地址如下:

  • www.java3y.com?token=xxxxxxx

接着,系统A去sso认证中心验证这个Token是否正确,如果正确,则系统A和用户建立局部会话(创建Session)。到此,系统A和用户已经是登录状态了。

                        

此时,用户想要访问系统Bwww.java4y.com受限的资源(比如说订单功能,订单功能需要登录后才能访问),系统B www.java4y.com发现用户并没有登录,于是重定向到sso认证中心,并将自己的地址作为参数。请求的地址如下:

  • www.sso.com?service=www.java4y.com

注意,因为之前用户与认证中心 www.sso.com已经建立了全局会话(当时已经把Cookie保存到浏览器上了),所以这次系统B重定向到认证中心www.sso.com是可以带上Cookie的。

认证中心根据带过来的Cookie发现已经与用户建立了全局会话了,认证中心重定向回系统B,并把Token携带过去给系统B,重定向的地址如下:

  • www.java4y.com?token=xxxxxxx

接着,系统B去sso认证

  • 用户通过登录子系统进行用户登录;
  • 用户登录子系统记录了用户的登录状态、OpenId等信息;

中心验证这个Token是否正确,如果正确,则系统B和用户建立局部会话(创建Session)。到此,系统B和用户已经是登录状态了。

                             

看到这里,其实SSO认证中心就类似一个中转站

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章