单点登录(SSO)

单点登录Single Sign On(SSO)
参考https://yq.aliyun.com/articles/636281
解决在一个系统登录,其他系统就不用登录的问题。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统

  • 先说下普通登录:
    用户名和密码向服务端进行验证,完成登录认证后,将这个用户的session中标记状态改为yes,用户访问浏览器中写入Cookie(作为用户的唯一标识),下次请求会带上这个Cookie,服务端根据这个Cookie找到对应的session,判断这个用户是否登录。如果不做特殊配置,这个Cookie的名字叫做jsessionid,值在服务端(server)是唯一的。

大在这里插入图片描述
好了,下面说单点登录,分为同域下的SSO和不同域下的SSO。
1、同域下的SSO:
利用Cookie的顶域特性,使顶域部分相同即解决子域的各个系统认证问题,服务端认证通过把3个系统的Session共享解决问题。
在这里插入图片描述

2、不同域下的单点登录

(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不共享也是没问题的。

注:
1)所有应用系统共享一个身份认证系统。
    统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。

2)所有应用系统能够识别和提取ticket信息
    要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。

注:
1)Cookie的Domain属性:domain表示的是cookie所在的域,默认为请求的地址,如网址为www.study.com/study,那么domain默认为www.study.com。而跨域访问,如域A为t1.study.com,域B为t2.study.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.study.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.study.com。注意:一般在域名前是需要加一个".“的,如"domain=.study.com”。

2)共享Session的解决方案:
在这里插入图片描述
传统模式中,当request进入web容器,根据reqest获取session时,如果web容器中存在session则返回,如果不存在,web容器则创建一个session。然后返回response时,将sessonId作为response的head一并返回给客户端或者浏览器。
但是上节中说明了traditional-session的局限性在于:单机session。在此限制的相反面,即将session从web容器中抽出来,形成独立的模块,以便分布式应用或者集群都能共享,即能解决。

spring-session的核心思想在于此:将session从web容器中剥离,存储在独立的存储服务器中。目前支持多种形式的session存储器:Redis、Database、MogonDB等。session的管理责任委托给spring-session承担。当request进入web容器,根据request获取session时,由spring-session负责存存储器中获取session,如果存在则返回,如果不存在则创建并持久化至存储器中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值