后端面试每日一题 如何设计一个单点登录系统?

实现方式

  • 父域Cookie,只需要将 Cookie 的 domain 属性设置为父域的域名(主域名),同时将 Cookie 的 path 属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie 了
    • 不过这要求应用系统的域名需建立在一个共同的主域名之下,如 http://tieba.baidu.comhttp://map.baidu.com,它们都建立在 http://baidu.com 这个主域名之下,那么它们就可以通过这种方式来实现单点登录。
    • 此种实现方式比较简单,但不支持跨主域名。基本没戏。。
  • 认证中心,认证中心就是一个专门负责处理登录请求的独立的 Web 服务。用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token 写入 Cookie。(注意这个 Cookie 是认证中心的,应用系统是访问不到的。)
    • CAS、XXL-SSO都是这种类型
    • 此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法
  • 第三方登录
    • QQ登录、微信登录、微博登录等

基本上所有的SSO系统,所会对CAS有所借鉴。

TO B、TO G类的项目选用CAS或者类似的较多

TO C选择OAuth(QQ、微信第三方登录)较多

认证流程

首次访问受限资源时

  • 首次访问时,重定向到SSO服务端登录页,返回登录表单给浏览器。
  • 用户提交用户名密码,SSO服务端验证
  • 成功后,SSO服务端写全局cookie携带ticket重定向会SSO客户端
  • 客户端与SSO验证ticket有效性,返回验证信息
  • SSO客户端写局部会话cookie,重定向回原地址,业务系统返回资源。

img

如果登录,直接跳转,即执行:

response.sendRedirect(urlToRedirectTo);

第二次访问该系统

第二次访问该系统,会在该域名下存在上一步写的cookie,请求该系统时携带cookie,所有filter不会拦截该请求,直接返回资源。

img

首次访问其他系统

在该系统域名下不存在局部会话,所以重定向到SSO服务端,SSO服务端会发现此客户端已经登录,所有生成ticket,客户端与SSO验证ticket有效性,返回验证信息,SSO客户端写局部会话cookie,重定向回原地址,业务系统返回资源。

img

总结

  • CAS即有一个单点认证服务
  • 同一个系统,第二次免登录是由局部Cookie实现。
    • 这个可以自定义不适用Cookie也行。
  • 不同的系统,只需登录一次,是由全局Cookie实现。
    • 这一步一般不能改,只能是Cookie,使用浏览器自动携带属性
    • (实际做项目不是这么死板,可以不用cookie,也可以不用局部cookie 所有都使用全局token)
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lakernote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值