• 什么叫做 SSO


    什么叫做 SSO

    本文写于 2020 年 12 月 8 日

    SSO 的全称叫做 Single Sign On,意味「单点登录」。

    何为单点登录?就是你希望自己的两个网站,可以做到:一个网站登录了,另一个就不需要再次登陆了。例如淘宝和天猫,你只需要登陆一次即可。

    用专业一点的话来讲,即:在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录

    单系统的登陆

    HTTP 是一个无状态的协议,也就是服务器压根儿不知道你是否登陆了。因此我们需要给用户发一个“通行证”,也就是 Cookie,用户每次都会带上 Cookie 让服务器得以确认一些信息。通常我们会在服务器维护一个 Session 对象,里面存了登陆用户的 SessionId,当用户退出登陆后就移除 Session 对象中的对应 Id。

    • 登录: 将用户信息保存在 Session 对象中。
      • 如果在 Session 对象中能查到,说明已经登录。
      • 如果在 Session 对象中查不到,说明没登录(或者已经退出了登录)。
    • 退出登录: 从 Session 中删除用户的信息。
    • 关闭重新打开浏览器后还能保持登录: 使用 Cookie 来达成该功能。

    多系统登陆

    Session 不共享

    上面的方法在单系统下是没有问题的,但是如果是多系统呢?多系统的 Session 很可能是不共享的呀。

    那我们就得做出修改了,首先我们得将 SSO 单独做一个系统,其他的子系统登陆的时候请求 SSO 系统进行登陆。

    • SSO 系统生成一个 token,将用户信息存起来,并且设置一个过期时间;
    • 其他系统登陆时请求 SSO,SSO 系统返回 token,将其写入 cookie 中;
    • 每次请求时,前端会带上 cookie,拦截器得到了 token 之后,就能判断其是否登陆了。

    但是,cookie 不能跨域呀。Session 不能共享的问题解决了,cookie 的问题呢?

    有三种解决方案:

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

    (完)

  • 相关阅读:
    (二)使用log4net写入数据库自定义日志
    (一)使用log4net生成日志文件
    微信公众号测试号内网配置以及微信网页授权
    ios浏览器调试踩坑(1)----mescroll.js和vue-scroller
    three 3D实例学习
    golang解析git log时间
    Shell 简易教程
    golang 并发程序写入map两种实现方式sync.Mutex和chan的效率对比
    golang字符串string与字符数组[]byte高效转换
    mysql begin rollback commit 事务互斥验证
  • 原文地址:https://www.cnblogs.com/xhyccc/p/14101697.html
Copyright © 2020-2023  润新知