单点登录方案调研与实现

news/2024/5/12 19:23:07/文章来源:https://blog.csdn.net/Dreamy_LIN/article/details/134809954

作用

在一个系统登录后,其他系统也能共享该登录状态,无需重新登录。

演进

cookie → session → token →单点登录

Cookie

可以实现浏览器和服务器状态的记录,但Cookie会出现存储体积过大和可以在前后端修改的问题

Session

为了解决Cookie的数据敏感问题,Session应运而生。

  • 常见的实现方式是基于Cookie。只将口令放置Cookie,通过口令实现前后端数据的映射,大部分数据存储于服务器的session中,这里会有一个全局sessions去存储每个用户的session,并设置每个的有效期,一般20分钟。超时则重新生成和更新全局sessions。
  • 分布式问题:通常服务器是集群,用户的请求会走到负载均衡,不一定打在同一台登录请求的机器上,那不就 session 失效了吗
    • 解决方案:
      • 第一种,把 session 集中存储,给个独立的 redis 或普通数据库
      • 第二种,将相同 ip 请求的负载均衡都打在同一台机器上。
    • 通常是第一种,因为第二种的同一台机器会出现请求过多宕机的问题。

token

  • 解决场景

    session 的维护给服务端造成很大困扰,我们必须找地方存放它,又要考虑分布式的问题,甚至要单独为了它启用一套 Redis 集群。有没有更好的办法?——token

    登录场景不需要往 session 存太多东西,那为何不直接打包到 cookie 中呢?这样服务端就不用存了,每次核验 cookie 带的 token 有效性就可以了,还可以存一些轻量的信息。

  • HTTP 头部

    token 认证则不需要后台保存,token一般放在HTTP请求头的 Authorization 中

  • 流程

    • 输入用户密码,通过的话,服务器返回 token
    • 浏览器每次携带该 token 去请求数据

来源

最早起源于多服务器间 session 数据一致的问题。

方案

关键如何让 Session ID(或 Token 在多个域中共享)

不同的项目情况,适用不同的方案,适合的才是最好的

按照域名划分方式分类:

同主域

一个企业,一般情况下只有一个域名,通过二级域名区分不同的系统。

二级域名不同也算跨域。当协议,域名,端口其中一个不同时,就算跨域了。

例如 aliyun.com,其他业务系统分别为:a.aliyun.comb.aliyun.com ,要做单点登录,需要一个登录系统,叫做 account.aliyun.com ,我们只要在 acount.aliyun.com 登录了,a.aliyun.comb.aliyun.com 也登陆了

实现

  • 方法一: Root Cookie 方式
    • 原理:同一域名下的不同子域名属于同一主域名,主域名下的 cookie 在不同子域名中都是可见的。

    • 将得到的 ticket 写入根 Cookie 里,通过修改 domain。这一步前后端择一写即可

      利用二级域名写一级域名的 Cookie, acount.aliyun.com 登录后,可将 cookie 的域设置为顶域,即 .aliyun.com ,这样所有的子域都可以访问到顶域的 cookie

      • 前端:react 和 vue 都有 js-cookie 包

        import Cookies from 'js-cookie'
        Cookies.set('key', 'value', { domain: 'localhost' })
        

        前提:后端没有配置 httpOnly,否则无法通过 document.cookie 方式读写,但有些浏览器仍支持写入。

      后端:java

      Cookie cookie = new Cookie("key", "value");cookie.setDomain('.example.com')
      

      无需在 domain 后加上端口号。设置完后,同主域名的网址打开浏览器的存储,便能看到 cookie 了。

    • 总结:实现简单,不支持跨主域名的方式

  • 方法二:postMessage + iframe 方案,无需后端参与
    • 可以实现同主域和不同主域,不同的是同主域的实现即便关闭后,再打开也没问题。不同主域的,关闭后就不会保存了。监听 message 的同时,在 postMessage 后,窗口就会触发了。

    • cross-storage 库,实现了对该方案的封装

      • 原理:类似中转站,所有的登录信息的存储或获取都通过该中转站
      • 使用注意
        • 如果无法连接成功的,可以考虑将初始化代码放入 html 中,并单独开启一个服务器(例如小型 node),用来对该页面的访问。

        • CrossStorageHub.init 时,localhost 和 域名都要写上

          CrossStorageHub.init([{origin: /.*localhost:808\d$/, allow: ['get', 'set', 'del']},{origin: /.*data.com:300\d$/, allow: ['get', 'set', 'del']}
          }]
          
    • 缺陷:Safari 浏览器不兼容该方案

      • 原因:postMessage + iframe(cross-storage)由于 safari 浏览器只支持和 iframe 通信,不支持新窗口通信,无论是通过 iframe.src 带上 token 的 query 还是通过 postMessage 存储到 localStorage 里。新打开一个窗口后,localStorage 里都没有之前的存储值。
        在这里插入图片描述

      • cross-storage 的文档,也给出了降级方案

        • 可以采用 root cookie 方式
        • 让服务端返回的方式
        • 直接去改变safari浏览器的配置。 (不建议)

        在这里插入图片描述

        • 跳转的 url 链接带上该 token 的 query,前提是要点击后才能触发。再保存到本地

不同主域

实现:

  • 方法一:

    部署一个 SSO 认证中心,专门负责处理登录请求(登录、登出、获取用户信息、当前用户状态),是单点登录的标准做法。

    类似中转站,所有子系统的登录都要询问一遍这个中转站

    CAS: 基于 SSO 认证中心的开源项目代表,Central Authentication Service 即中央认证服务

  • 方法二:iframe + postMessage 的方式

    同上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_191147.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day70

今日回顾 session 中间件 auth session Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更…

西南科技大学C++程序设计实验七(继承与派生二)

一、实验目的 1. 掌握多继承程序设计 2. 掌握虚基类编程 3. 拓展学习可视化程序设计中的继承与派生应用 二、实验任务 重点:掌握虚基类的定义与实现,拓展其功能。 阅读分析、完善程序。下面程序(1)与程序(2)分别是没有使用虚基类和使用虚基类的代码,其中A是最上层基…

【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok,在上篇文章中我们讲了在Spring cloud中使用Zuul网关,这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话,本篇博客就是配置子模块,或者说是微服务,然后将微服务正式启动之前…

【Python】 生成二维码

创建了一个使用 python 创建二维码的程序。 下面是生成的程序的图像。 功能描述 输入网址(URL)。 输入二维码的名称。 当单击 QR 码生成按钮时,将使用 QRname 中输入的字符将 QR 码生成为图像。 程序代码 import qrcode import tkinterd…

使用dockerfile 构建自己的nacos-mysql

前言 在部署nacos的时候触发的脑袋灵光一闪,每次部署nacos都要部署下mysql服务器,然后导入sql语句,配置nacos配置文件,那有没有简单的方法实现一键部署nacos和nacos-mysql 呢? 答案是肯定!如下目录图: …

Navicat 技术指引 | 适用于 GaussDB 分布式的用户/权限功能

Navicat Premium(16.3.3 Windows 版或以上)正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结…

Navicat 技术指引 | 适用于 GaussDB 分布式的查询功能

Navicat Premium(16.3.3 Windows 版或以上)正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结…

Android 等待view 加载布局完成 (包括动态生成View)

前言 在实际开发中,有很多组件需要 根据数据,动态生成,或者 追加 / 减少 子view,由于View布局需要时间,此时想要获取父View的最新宽高值,要么手动测量,要么等待布局完成后再获取; …

使用 Axios 进行网络请求的全面指南

使用 Axios 进行网络请求的全面指南 本文将向您介绍如何使用 Axios 进行网络请求。通过分步指南和示例代码,您将学习如何使用 Axios 库在前端应用程序中发送 GET、POST、PUT 和 DELETE 请求,并处理响应数据和错误。 准备工作 在开始之前,请…

Navicat 技术指引 | 连接 GaussDB 分布式

Navicat Premium(16.3.3 Windows 版或以上)正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结…

【每日一题】下一个更大的数值平衡数

Tag 【模拟】【取模运算】 题目来源 2048. 下一个更大的数值平衡数 解题思路 方法一&#xff1a;模拟 思路 观察到数据量 0 < n < 1 0 6 0< n <10^6 0<n<106&#xff0c;我们可能返回的数值平衡数最大是 1224444&#xff0c;这个范围可以在时间要求内…

高效的多维空间点索引算法——GeoHash

一、Geohash 算法简介 GeoHash是空间索引的一种方式&#xff0c;其基本原理是将地球理解为一个二维平面&#xff0c;通过把二维的空间经纬度数据编码为一个字符串&#xff0c;可以把平面递归分解成更小的子块&#xff0c;每个子块在一定经纬度范围内拥有相同的编码。以GeoHash方…

多人聊天Java

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{ public static ServerSocket server_socket; public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []ar…

将单体应用程序迁移到微服务

多年来&#xff0c;我处理过多个单体应用&#xff0c;并将其中一些迁移到了微服务架构。我打算写下我所学到的东西以及我从经验中用到的策略&#xff0c;以实现成功的迁移。在这篇文章中&#xff0c;我将以AWS为例&#xff0c;但基本原则保持不变&#xff0c;可用于任何类型的基…

web前端之css变量的妙用、通过JavaScrip改变css文件中的属性值、querySelector、setProperty

MENU 效果图htmlJavaScripstylequerySelectorsetProperty 效果图 html <div id"idBox" class"p_r w_680 h_160 b_1s_red"><div id"idItem" class"p_a l_0 t_30 w_100 h_100 bc_rgba_255_00_05 radius_50_"></div> …

智慧安防三大信息技术:云计算、大数据及人工智能在视频监控EasyCVR中的应用

说到三大信息技术大家都很清楚&#xff0c;指的是云计算、大数据和人工智能&#xff0c;在人工智能&#xff08;AI&#xff09;快速发展的当下&#xff0c;例如常见的大数据分析、人工智能芯片生产的智能机器人等等&#xff0c;在工作、生活、教育、金融、科技、工业、农业、娱…

Embedding And Word2vec

Embedding与向量数据库&#xff1a; Embedding 简单地说就是 N 维数字向量&#xff0c;可以代表任何东西&#xff0c;包括文本、音乐、视频等等。要创建一个Embedding有很多方法&#xff0c;可以使用Word2vec&#xff0c;也可以使用OpenAI 的 Ada。创建好的Embedding&#xff…

优化记录 -- 记一次搜索引擎(SOLR)优化

业务场景 某服务根据用户相关信息&#xff0c;使用搜索引擎进行数据检索 软件配置 solr 1台&#xff1a;32c 64g 数据10gb左右&#xff0c;版本 7.5.5 应用服务器1台&#xff1a;16c 64g 应用程序 3节点 问题产生现象 1、因业务系统因处理能不足&#xff0c;对业务系统硬件…

k8s引用环境变量

一 定义环境变量 ① 如何在k8s中定义环境变量 env、configmap、secret补充&#xff1a; k8s 创建Service自带的环境变量 ② 从pod属性中获取 kubectl explain deploy.spec.template.spec.containers.env.valueFrom关注&#xff1a; configMapKeyRef、fieldRef 和 resour…