单点登录原理与简单实现

https://www.cnblogs.com/UncleWang001/articles/9669653.html
https://www.cnblogs.com/ywlaker/p/6113927.html(应该是原汁原味的原文)

一、假设有三个系统,分别是a.com、b.com和sso.com,各自代表a系统,b系统和认证中心
(疑问:若a.com系统已登录,当用户进入b系统时,跳转到sso后是怎么判断用户已经登录的)

.
1、在a.com系统在sso.com登录认证后(登录时是跳到sso.com登录的,因此生成的全局会话是sso和浏览器的会话),sso生成全局会话,这个会话中保存生成的token。

2、当用户访问b系统时,发现b系统并未登录,于是跳转到sso系统中,sso系统查看本系统(即认证中心)中的session中是否已经保存有登录状态,即全局会话,若有则说明用户已经登录了,此时sso会把自己的session中的token放在需要跳转到b系统的链接中作为参数传过去,然后b系统再校验token的合法性;若无则表示没有登录。因为sso的全局会话是和浏览器的会话,因此只在当前浏览器中有效,就算有人拿到了token,然后在别的电脑上拿着它通过链接去sso验证,由于别的电脑的浏览器是没有这个全局会话的,因此是无法校验成功的。

其实解决疑惑的最重要的一点时,用户访问b系统时,发现没有登录后,是让浏览器跳转到sso系统,跳转后实际上是sso与浏览器在会话

二、子系统如何校验令牌?认证中心如何判断令牌的合法性?

用户输入用户名与密码在认证中心登录成功后,使用userId+subSystemId+timeMillis+randomString作为原始令牌,再用RSA加密,得到发放给子系统的令牌,任何人拿到这个令牌都是解不开的,子系统使用这个令牌,首先要去认证中心校验,校验就是让认证中心解密这个令牌,然后将解密后的内容(包括userId,当然你可以使用username)返回给子系统,子系统就知道当前登录的用户id或者name了
因此,子系统和认证中心通信必须保证安全,cas抛弃httpClient转而使用自己开发的协议也是这个原因

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值