基于redis+springboot从零开始设计一个类阿里系的单点登录(1)

简介: 基于redis+springboot从零开始设计一个类阿里系的单点登录(1)

生活中的事情

最近购物的时候遇到一个很奇妙的情况,我发现我只在天猫登录了,之后去淘宝买东西的时候,完全不虚要登录,这是为什么?

1.png


2.png



首先我去天猫登录一下,之后刷新淘宝来看看,登录天猫之后,直接去刷新淘宝页面

3.png

4.png




我们会发现淘宝也登录了,为什么可以这么方便呢?这里就用到了单点登录的概念。


什么是单点登录

单点登录在大型网站里使用得非常频繁,例如,阿里旗下有淘宝、天猫、支付宝,阿里巴巴,等网站,还有背后的成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协 作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。


单点登录在大型网站里使用得非常频繁,例如,阿里旗下有淘宝、天猫、支付宝,阿里巴巴,阿里妈妈, 阿里妹妹等网站,还有背后的成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协 作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯 掉。


所以,单点登录要解决的就是,用户只需要登录一次就可以访问所有相互信任的应用系统。


单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO 并 不能算是一种架构,只能说是一个解决方案。SSO核心意义就一句话:一处登录,处处登录;一处注 销,处处注销。就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,即 用户只需要记住一组用户名和密码就可以登录所有有权限的系统。


使用“单点登录”还是SOA时代的需求之一。在面向服务的架构中,服务和服务之间,程序和程序 之间的通讯大量存在,服务之间的安全认证是SOA应用的难点之一,应此建立“单点登录”的系统体系能 够大大简化SOA的安全问题,提高服务之间的合作效率。


简谈SSO的发展

早期的单机部署

早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的,所有的功能,所 有的业务,后台管理,门户界面,都是由这一个war来支持的,这样的单应用,也称之为单体应用,因为十分不好 扩展和拆分。


在单体应用下,用户的登录以及权限就显得十分简单:过滤器,用户登录成功后,把相关信息放入会话 中,HTTP维护这个会话,再每次用户请求服务器的时候来验证这个会话即可


验证登录的这个会话就是session,维护了用户状态,也就是所谓的HTTP有状态协议,我们经常可以在浏览 器中看到JSESSIONID,这个就是用来维持这个关系的key。


分布式集群部署

由于网站的访问量越来也大,单机部署已经是巨大瓶颈,所以才有了后来的分布式集群部署。

例如:如 果引入集群的概念,1单应用可能重新部署在3台tomcat以上服务器,使用nginx来实现反向代理, 此时,这个 session就无法在这3台tomcat上共享,用户信息会丢失,所以不得不考虑多服务器之间的session同步问 题,这就是单点登录的来源。

5.png



多种解决方案

单点登录的实现方案,一般就包含以下三种:


Cookies

Session同步

分布式Session方式

目前的大型网站都是采用分布式Session的方式。我先从cookie的实现谈起,你就能很清楚的知道为什 么需要分布式session方式实现单点登录。


基于Cookie的单点登录

最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。 用户登录父应用之后,应用返回 一个加密的cookie,当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie并进行校验, 校验通过则登录当前用户。


不难发现以上方式把信任存储在客户端的Cookie中,这种方式很容易令人质疑:


Cookie不安全

不能跨域实现免登

对于第一个问题,通过加密Cookie可以保证安全性,当然这是在源代码不泄露的前提下。如果Cookie 的加密算法泄露,攻击者通过伪造Cookie则可以伪造特定用户身份,这是很危险的。 对于第二个问题,不能跨域实现免登更是硬伤。所以,才有了以下的分布式session方案


分布式session单点登录

我们这次就是基于redis的单点登录


例如,阿里有很多系统分割为多个子系统,独立部署后,不可避免的会遇到会话管理的问题,类似这样 的电商网站一般采用分布式Session实现。 再进一步可以根据分布式Session+redis,建立完善的单点登录或账户管理系统。


流程运行:


用户第一次登录时,将会话信息(用户Id和用户信息),比如以用户Id为Key,写入分布式 Session;

用户再次登录时,获取分布式Session,是否有会话信息,如果没有则调到登录页

一般采用Cache中间件实现,建议使用Redis,因此它有持久化功能,方便分布式Session宕机后, 可以从持久化存储中加载会话信息;

存入会话时,可以设置会话保持的时间,比如15分钟,超过后自动超时;

结合Cache中间件实现的分布式Session,可以很好的模拟Session会话。


常见方案

实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效 性,


因此要点也就以下两个:


存储信任 服务器生产

验证信任 ~ 拿到服务器再次验证~


身份认证技术:

cas(单点登录)

Spring Security OAuth2(第三方登录授权:QQ登陆)

jwt (客户端token:原生)


安全控制框架:

spring-security

shiro


相关文章
|
7月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
606 5
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
453 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
8月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
671 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
1327 79
|
NoSQL Java Redis
Springboot使用Redis实现分布式锁
通过这些步骤和示例,您可以系统地了解如何在Spring Boot中使用Redis实现分布式锁,并在实际项目中应用。希望这些内容对您的学习和工作有所帮助。
1403 83
|
11月前
|
机器学习/深度学习 数据采集 人机交互
springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
754 0
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
存储 人工智能 NoSQL
SpringBoot整合Redis、ApacheSolr和SpringSession
本文介绍了如何使用SpringBoot整合Redis、ApacheSolr和SpringSession。SpringBoot以其便捷的配置方式受到开发者青睐,通过引入对应的starter依赖,可轻松实现功能整合。对于Redis,可通过配置RedisSentinel实现高可用;SpringSession则提供集群Session管理,支持多种存储方式如Redis;整合ApacheSolr时,借助Zookeeper搭建SolrCloud提高可用性。文中详细说明了各组件的配置步骤与代码示例,方便开发者快速上手。
237 11
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
2122 12
|
NoSQL Java API
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Spring Boot 集成 Redis
本文介绍了在Spring Boot中集成Redis的方法,包括依赖导入、Redis配置及常用API的使用。通过导入`spring-boot-starter-data-redis`依赖和配置`application.yml`文件,可轻松实现Redis集成。文中详细讲解了StringRedisTemplate的使用,适用于字符串操作,并结合FastJSON将实体类转换为JSON存储。还展示了Redis的string、hash和list类型的操作示例。最后总结了Redis在缓存和高并发场景中的应用价值,并提供课程源代码下载链接。
2714 0