SSO单点登陆

一,单点登陆的定义

   单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下两个:存储信任验证信任

二,解决方案

  一般说来,大型应用会把授权的逻辑与用户信息的相关逻辑独立成一个应用,称为用户中心。 用户中心不处理业务逻辑,只是处理用户信息的管理以及授权给第三方应用。第三方应用需要登录的时候,则把用户的登录请求转发给用户中心进行处理,用户处理完毕返回凭证,第三方应用验证凭证,通过后就登录用户。

三,方案设计

单点登录的大致流程如下:

1.用户首次访问A系统,A系统发现用户未登录,则重定向到SSO认证中心并携带请求url,进行登录验证;

2.用户在SSO认证中心进行用户名和密码验证登录,登录成功后,服务器生成一个令牌ticket(相当于token,可以对用户id进行加密生成),然后重定向到系统A的源url并将该ticket追加到url参数。

3.系统A获取到url参数中的ticket,向SSO发起ticket校验校验成功,则系统A放行,并将ticket存入到cookie。

4.用户访问B系统,此时B系统domain下已经携带ticket,直接向SSO发起ticket校验校验成功,则放行,并将ticket存入cookie(更新ticket过期时间)

5.用户登出时,移除domain下的cookie。

说明:第三步向SSO发起ticket校验,能够有效防止他人直接截获cookie而获得权限。考虑到是子系统之间共享的cookie,所以清除子系统的cookie即可。

四,原理图

说明: 图中token验证为了方便存在将token存在redis中,不用redis可以替代成从数据库中获取用户信息认证即可。

五,Demo测试

#对应app-a,端口为7071

#对应app-b,端口为7071

#对应sso-server,端口为7070

1.首先启动这三个项目

2.然后访问app-a的home页面(http://localhost:7071/home),因为未登录所以跳转到sso的登录页面;

4.在app-b的Home界面退出登录,再访问app-a的home界面,则要求重新登录.

 

Demo代码地址:https://gitee.com/gxp77/SpringBoot-SSO.git

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值