微服务(十一)—— 单点登录

08-微服务版单点登陆系统(SSO)实践(2107~2108~2109~2110) 分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。《Java高级面试》《Java高级架构知识》《算法知识》合法性)。*//**配置令牌的存储策略,对于oauth2规范中提供了这样的几种策略1)JdbcTokenStore(这里是要将token存储到关系型数据库)2)RedisTokenStore(这是要将token存储到redis数据库-key/value)3)JwtTokenStore(这里是将产生的token信息存储客户端,并且token。 阅读详情

上一篇: 微服务(十)—— Feign的使用.

1. 介绍

在单服务下,用户通过浏览器登录,通过会话管理保存用户登录信息,Cookie通过在客户端记录信息确定用户身份,Session通过在服务端记录信息确定用户身份。
当浏览器访问服务器时,会创建一个Session对象,同时Session对象里会随机生成一个id值,然后通过response返回给浏览器保存在cookie里,当浏览器下一次访问服务器时,会根据浏览器所带的cookie里的id找到对应的session。
但是对于微服务来说,session保存在不同的服务器,所以用户登录后访问不同的服务就需要重新登录,者显然是不合理的。
这就需要解决session问题,有下面几种实现方式:

(1)session同步

Tomcat支持动态的将某个Tomcat下的session复制到其它的Tomcat中。
在这里插入图片描述
这种方式在集群数量比较少的时候,使用还可以。如果集群数量庞大,都需要复制session,这时候会因为网络延迟,或者session比较大,同步慢等问题。

(2)session黏着(放在服务端)

在这里插入图片描述
通过对IP地址或者域名地址进行hash;解决了第一个网络延迟同步慢的问题。
缺点: 用户浏览器的IP地址hash后,满足单调性。可能会造成资源分配的不均衡,就不能达到负载均衡的目的。

(3)将信息存放到cookie客户端

session存在服务器端,会对服务器端有一定的压力,如果将信息保存到cookie中,不但减轻了服务器的压力,同时每个客户端的压力也很小。
缺点: cookie可以被禁用,cookie要随着浏览器传递,增大了传送的内容,而且cookie大小也有限制。

(4) SSO单点登录

在这里插入图片描述
将session从系统中独立出来。建立一个专门的服务去保存session 信息,其它服务需要session信息的时候都去请求这个服务。一般都是保存在Redis中,因为Redis的访问速度快。

2. 实现过程

我在系统中使用的是第四种方式——SSO单点登录。

2.1 思路

首先用户登录,登录成功后将用户信息存储在Redis数据库中,并且将键的过期时间设置为 1 小时。我这里是用用户名为键,用户对象信息为值,我将用户对象转换为json格式存储在数据库中。因为我在建立用户表的时候,将用户名加了唯一索引 并且注册的时候做了唯一判断,所以不存在键冲突的情况。
然后告诉前端,每次向后端发送请求的时候将用户名放到请求头中,后端在需要用户登录的接口先从请求头中获取用户名,然后从Redis中根据键取出值,如果值为空,说明用户没有登录,返回一个需要登录的信息;如果不为空,说明已经成功登录,就不需要再登录。并且将该信息再次存在Redis,并且将过期时间设置为 1 小时。
这样不仅解决了单点登录的问题,还解决了登录过期重新登录的问题。

2.2 实现

首先,写一个Redis的配置类:RedisConfig

package com.aiun.common.config;
/**
 * Redis配置类
 * @author lenovo
 */
@Configuration
public class RedisConfig {
	@Bean
	public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory){
		RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
		//为string类型key设置序列器
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		//为string类型value设置序列器
		redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
		//为hash类型key设置序列器
		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
		//为hash类型value设置序列器
		redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
		redisTemplate.setConnectionFactory(redisConnectionFactory);
		return redisTemplate;
	}
}

引入连接Redis依赖,这个依赖是在SpringBoot里的,所以SpringBoot指定了依赖,这里就不需要了。

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

在application.yml配置文件里配置Redis的连接信息

# redis 缓存
spring:
  redis:
    timeout: 10000            # 连接超时时间
    host: localhost           # Redis服务器地址
    port: 6379                # Redis服务器端口
    password: 123456
    database: 0               # 选择哪个库,默认0库
    lettuce:
      pool:
        max-active: 1024      # 最大连接数,默认 8
        max-wait: 10000       # 最大连接阻塞等待时间,单位毫秒,默认 -1
        max-idle: 200         # 最大空闲连接,默认 8
        min-idle: 5           # 最小空闲连接,默认 0

然后在需要使用Redis的类里面,注入RedisTemplate<String,String>就可以使用了。
用户登录的业务逻辑实现:

package com.aiun.user.service.impl;
/**
 * 用户模块实现类
 * @author lenovo
 */
@Service("iUserService")
public class UserServiceImpl implements IUserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Override
    public ServerResponse<User> login(String userName, String password) {
        int resultCount = userMapper.checkUsername(userName);
        if (resultCount <= 0) {
            return ServerResponse.createByErrorMessage("用户名不存在");
        }
        //密码登录并MD5加密
        String md5password = MD5Utils.MD5EncodeUtf8(password);
        User user = userMapper.selectLogin(userName, md5password);
        if (user == null) {
            return ServerResponse.createByErrorMessage("密码错误");
        }
        String key = userName;
        String token = JsonUtils.object2JsonStr(user);
        ValueOperations<String, String>valueOperations = redisTemplate.opsForValue();
        // 用户登录成功后,将该用户对象作为token值保存到redis里,并且设置过期时间为1小时
        valueOperations.set(key, token, 1, TimeUnit.HOURS);
        return ServerResponse.createBySuccess("登录成功", user);
    }
    //......    
}

然后在需要进行登录验证的接口进行登录的验证,这里以订单的Controller层为例;
因为多个接口都需要验证,所以这里定义一个公共的私有方法:

/**
     * 判断用户登录是否过期
     */
    private ServerResponse<User> loginHasExpired(HttpServletRequest request) {
        String key = request.getHeader(UserConst.AUTHORITY);
        ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
        String value = valueOperations.get(key);
        if (StringUtils.isEmpty(value)) {
            return ServerResponse.createByErrorMessage(ResponseCode.NEED_LOGIN.getCode(), ResponseCode.NEED_LOGIN.getDesc());
        }
        User user = JsonUtils.jsonStr2Object(value, User.class);
        if (!key.equals(user.getUsername())) {
            return ServerResponse.createByErrorMessage(ResponseCode.NEED_LOGIN.getCode(), ResponseCode.NEED_LOGIN.getDesc());
        }
        // 登录成功,重新设置键的过期时间
        valueOperations.set(key, value, 1, TimeUnit.HOURS);
        return ServerResponse.createBySuccess(user);
    }

然后在需要判断用户登录的接口调用该方法就行。

/**
     * 订单查询
     * @param request 请求
     * @param orderNo 订单号
     * @param pageNum 当前页
     * @param pageSize 页大小
     * @return 返回结果
     */
    @PostMapping("manage/search")
    @ApiOperation(value = "订单查询")
    public ServerResponse<PageInfo> orderSearch(HttpServletRequest request, Long orderNo, @RequestParam(value = "pageNum", defaultValue = "1") int pageNum, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        ServerResponse hasLogin = loginHasExpired(request);
        if (hasLogin.isSuccess()) {
            User user = (User) hasLogin.getData();
            if (user.getRole() == UserConst.Role.ROLE_ADMIN) {
                return iOrderService.manageSearch(orderNo, pageNum, pageSize);
            } else {
                return ServerResponse.createByErrorMessage("无权限操作,需要管理员权限");
            }
        }
        return hasLogin;
    }

如果登录就会获取到用户信息,如果没有登录,就返回一个需要登录的信息。

下一篇: 微服务(十二)—— 配置中心(backend-config-server).

微服务版单点登录系统(Spring Security) 目录 简介 多点登录系统 单点登录系统​ 快速入门案例 创建认证授权工程 添加项目依赖 构建项目配置文件 添加项目启动类 启动并访问项目 定义登录逻辑 业务描述 定义配置安全类 定义用户信息处理对象 网关中登录路由配置 基于Postman进行访问测试 自定义登录页面 颁发登录成功令牌 构建令牌配置对象 定义认证授权核心配置 配置网关认证的URL Postman访问测试 登录页面方案设计 资源服务器配置 添加依赖 令牌处理器配置 资源服务令牌... 阅读详情

相关推荐

单点登录的几种方案

单点登录单点登录存在原因方案一方案二:session同步方案三:第三方存储件存储session方案四:对接第三方系统的单点登录 视频讲解链接 单点登录存在原因 分布式微服务成为主流的情况下,需要解决只能在单个用户模块存储session的问题,其他模块需要能够同样取到用户的信息,避免用户反复登录。 方案一 Nginx代理,对IP进行hash,该IP生成的session存储在某一台服务器中 方案问题: 单点故障:某台服务器宕机,该服务器存储的所有session丢失,违背高可用。 所有服务器都具备全量模块,

weixin_38370441的博客 6175

微服务实现单点登录

1

m0_60875109的博客 2014

若依微服务整合CAS单点登录:从零到一的实战指南

本文提供了一份详细的实战指南,指导开发者如何在若依微服务框架中整合CAS单点登录。文章深入剖析了整合原理,并逐步演示了从环境准备、后端Auth服务改造(包括依赖引入、过滤器链配置、票据验证与本地令牌生成)到前端联调的全过程,旨在帮助用户快速实现一处登录、处处通行的企业级认证体验。

chair的专栏 723

1.9 微服务版单点登陆系统(SSO)

1 单点登陆系统简介 1.1 背景分析 传统的登录系统中,每个站点都实现了自己的专用登录模块。各站点的登录状态相互不认可,各站点需要逐一手工登录。例如: 这样的系统,我们又称之为多点登陆系统。应用起来相对繁琐(每次访问资源服务都需要重新登陆认证和授权)。与此同时,系统代码的重复也比较高。由此单点登陆系统诞生。 1.2 单点登陆系统 单点登录,英文是 Single Sign On(缩写为 SSO)。即多个站点共用一台认证授权服务器,用户在其中任何一个站点登录后,可以免登录访问其他所有站点。而且,各站点间可以

蟑螂恶霸的博客 2390

第1节、用户登录业务Token介绍

1. 用户登录业务介绍 1.1.单一服务器模式 早期单一服务器,用户认证。 缺点:单点性能压力,无法扩展 1.2.SSO(single sign on)模式 分布式,SSO(single sign on)模式 优点: 用户身份信息独立管理,更好的分布式管理。 可以自己扩展安全策略 缺点: 认证服务器访问压力较大。 1.3.Token模式 业务流程图{用户访问业务时,必须登录的流程} 优点: 无状态:token无状态,ses...

小小木的博客 747

Spring Cloud 微服务单点登录实现指南

在现代企业级应用开发中,微服务架构已经成为一种流行的设计范式。Spring Cloud作为Spring家族的成员之一,是建立微服务架构应用的首选框架。它基于Spring Boot,提供了一套完整的微服务解决方案,包括配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话和集群状态等功能。Spring Cloud的出现,简化了分布式系统的复杂性,使开发者可以更加专注于业务逻辑的实现。

weixin_32251525的博客 1011

十一.单点登录系统微服务版实践

文章目录 创建聚合工程项目架构工程结构创建工程 配置项目工程jt-cloud-ssojt-sso-commonjt-sso-authpom.xmlbootstrap.yml启动类 jt-sso-resourcepom.xmlbootstrap.yml启动类 j...

weixin_57619565的博客 241

FabricSSO:基于IdentityServer 4的微服务单点登录平台实战

htmltable {th, td {th {pre {简介:FabricSSO是一个基于IdentityServer 4构建的单点登录平台,采用微服务架构并专为Service Fabric Native环境设计。该平台实现用户一次登录即可访问多个关联应用,提升用户体验。项目集成了用户服务、客户端配置、权限控制、API保护及服务发现等多个模块,并支持容器化部署与服务编排,适用于构建高可用、可扩展的安全认证系统。

weixin_42506884的博客 1128

浅谈微服务架构中实现单点登录

在微服务架构中实现单点登录需要全面考虑安全性、令牌管理、认证和授权机制以及微服务间的通信方式。采用 OAuth 2.0 和 OpenID Connect 等标准协议,可以有效地实现单点登录,并确保系统的可扩展性和安全性。通过结合 API Gateway 和 Service Mesh 等技术,可以进一步简化开发和运维工作,实现一个高效、安全的微服务架构。

颜淡慕潇 2421

寒假实训笔记day01——认识M4单片机之STM32F405RGT6

认识M4单片机之STM32F405RGT6(含义、规格、参数)

weixin_47200070的博客 8547

网工最容易搞混的三个概念:防火墙、网闸、堡垒机,一文让你轻松搞明白。

网闸的作用可以简单概括为:在两个或多个不同安全级别的网络(如内网和外网、普通网与高安全网、受限网与互联网)之间建立一个严格隔离、信息流转的安全桥梁。它的核心任务是实现数据安全传输与隔离,避免网络之间的直接连接带来的安全隐患。数据传输安全:网闸保证数据从一个网络到另一个网络时,能够进行审查、过滤和转换,防止恶意数据或非法信息被传入内部网络或外部泄露。高安全性隔离:网闸常常用于企业的内外网隔离、军事网络、政府机关等对数据隔离要求极高的环境。

HWP18612324139的博客 3631

【Oauth2整合gateway网关实现微服务单点登录】

主要介绍OAuth2整合gateway实现微服务的单点登录的设计思路和简单实现

weixin_44585177的博客 2102

ZYNQ 系统的IEEE1588 实现方法

zynq IEEE588/PTP 实现方案(讨论稿)

姚家湾博客 1万+

微服务架构之单点登录

  随着架构的演进,从大杂烩到现在的微服务,架构发生了变化,那自然很多的东西也要随之改变,今天我们来说一说这个单点登录又是什么东西.   首先在分布式的结构下,一个项目被拆分成不同的微服务,每个微服务之间做着自己分内的事.然而有些需求却需要贯彻这整个项目,比如说登录,用户在一处登录后,访问项目中的每个微服务所管理的部分都应该实现已登录功能,在传统的单一服务器登录中,我们可以实现用session存值,通过判断session中是否有值,在进行判断用户是否登录.但是在微服务架构中是不能做到的.   所以进行就有了

qq_42400763的博客 2104

微信小程序内容安全审核:从API调用到工程化落地的全流程实践

内容安全是互联网应用开发中的基础性技术环节,尤其在用户生成内容(UGC)场景下,它直接关系到平台的合规性与用户体验。其核心原理通常结合了关键词过滤、自然语言处理(NLP)和计算机视觉(CV)等技术,通过AI模型对文本、图像、音频进行多维度风险识别。这项技术的价值在于,它不仅是满足监管要求的必要手段,更是构建健康社区生态、保护品牌声誉、实现产品长期稳定运营的基石,广泛应用于社交、电商、社区论坛等各类UGC平台。本文聚焦于微信小程序生态,深入剖析其官方提供的内容安全解决方案,详细解读如何将文本同步检测与多媒体异

weixin_28622215的博客 438

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存

如何读取ECU中指定内存地址的数据?图解UDS 0x23服务带你快速上手!!

车载系统攻城狮 2616

微服务——用户微服务单点登录

用户微服务单点登录为什么要使用单点登录原理链接:https://blog.csdn.net/weixin_45528987/article/details/105365115架构图看图可能还有点懵,下面贴过程与代码第一步:在用户微服务下添加两个依赖第二步:application.yml配置文件配置redis与jjwt的配置用户登录时的代码逻辑判断token是否过期或者存在盗用的风险 为什么要使用单...

weixin_45528987的博客 1257

反应动力学仿真软件:ChemkinPro_(11).敏感性分析

敏感性分析是化学反应动力学仿真中的一项重要技术,通过对模型参数的变化对模型输出的影响进行评估,可以帮助研究人员优化模型、验证实验数据和评估不确定性。ChemkinPro 提供了强大的敏感性分析功能,可以方便地进行参数选择、仿真设置和结果解读。通过实际案例研究,我们可以看到敏感性分析在燃烧、催化和环境化学等领域的广泛应用,为科学研究和工程应用提供了有力支持。

kkchenjj的博客 1300

单点登录--微服务的登录解决方案

既然聊到了单点登录,呢么我们就来看看到底什么是单点登录。 看一下官方的解释: 单点登录又称为sso(Single Sign On) ,就是通过用户的一次鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这就意味着在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗。 其实说的简单点,就是将用户的信息存储起来,然后在访问一个系统中别的.

qq_39949910的博客 3748

RDkit入门

今天开始写RDkit的入门教程,每天学习和写一小点,相信一句话“不积跬步无以至千里,不积小流无以成江海”,所以就慢慢来,一点一滴积累叭,从最简单的开始喽希望自己每天都能保持写博客的好习惯,把自己的代码笔记就极在这里,RDkit一块啃了很久的骨头,今天终于要下定决心,好好总结一波了,希望保持这个更新的频率,每天都能有所学。............

博客而已 6671

AI Agent开发第49课-DIFY让AI自动预约排班后发企业微信通知-MongoDb-Redis-企业微信调用

我们的Dify会讲得很透彻,坚持喂饭级教程,从一个基本的AI自动预约客户到自动记录客户的信息再到自动判断下一步如何走全部是AI化的,这是一个真正的AI原生应用,它来自于我的一个大型物业公司用AI自动预约系统中的一部分。我们会使用这个预约流做完整的Dify例子来讲完,因为它太有代表性了。工作流中的控制反转、AI决策下一步怎么走、人为干涉、用户行为判断、外部中间件如Redis,今天我们就要讲到在Dify中调用MongoDB的数据以及企业微信通知来作为预约派单的最后一步了。

打造全国最全的AI Agent开发知识领域的博客 1746

深入OAuth2 微服务下的SSO单点登录

优缺点 适用于场景

Evan.Zhou的博客 2188

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

springCloud微服务系列——单点登录OAuth2+JWT

    研究了好久的springCloud微服务架构,在这里整理总结一下,做个梳理和备忘。    这次总结的是微服务之间的认证。最近实现了一个基于spring security的适合单体应用和分布式应用,适合app和浏览器的一套自用鉴权框架。算是对spring security有了点比较深入的认识了,这里说一下通过OAuth2+JWT来解决微服务之间的鉴权问题。    这里不会涉及到细节问题,关于...

guduyishuai的博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

普通登录、微服务登录和单点登录的区别

之前解析token生成的用户的一个对象是一个强引用。然后我们的线程本地变量去把他绑定使用。假如现在生成了一个User实体,使用JWT可以理解成使用一种加密的方式来加密成一个字符串。拦截器获取到请求头里面的token,这个token有很多种形式,可能是uuid。请求的第一步:这个线程去解析变量。然后在这个线程里面去获取变量是没有问题的。【补充】Java中有四种引用,强引用、软引用、弱引用和虚引用。一个系统里面有n个服务来解决健全这样的一个问题。多个不相关的系统要使用同一套登录健全的服务。

qq_46130027的博客 689

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

基于微服务之sso单点登录

微服务简单单点登录解析

weixin_55026035的博客 1279

springboot实现单点登录示例

为此,springSession技术应运而生,在cookie和session技术大体方向不变的基础上,它将session信息存放到redis中,所有需要判断用户登录的请求均使用sessionID去redis中获取用户信息,同时对session放大作用域,使其在登录系统“auth.gulimall.com”中产生的session,在整个系统“gulimall.com”中都是有效的。● 1.2、创建三个springboot项目,配置认证服务器的端口为8080,两个资源服务器的端口分别为8081和8082。

MINmin521_的博客 1057
上一篇: 微服务(十)—— Feign的使用
下一篇: 微服务(十二)—— 配置中心(backend-config-server)
CodAlun
博客等级 码龄8年 46粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值