当前位置:网站首页>OAuth2:微服务权限校验Session共享
OAuth2:微服务权限校验Session共享
2022-07-31 14:05:00 【Leon_Jinhai_Sun】
虽然完成前面的部分,我们已经可以自己去编写一个比较中规中矩的微服务项目了,但是还有一个问题我们没有解决,登录问题。假如现在要求用户登录之后,才能进行图书的查询、借阅等操作,那么我们又该如何设计这个系统呢?
回顾我们之前进行权限校验的原理,服务器是如何判定一个请求是来自哪个用户的呢?
- 首先浏览器会向服务端发送请求,访问我们的网站。
- 服务端收到请求后,会创建一个SESSION ID,并暂时存储在服务端,然后会发送给浏览器作为Cookie保存。
- 之后浏览器会一直携带此Cookie访问服务器,这样在收到请求后,就能根据携带的Cookie中的SESSION ID判断是哪个用户了。
- 这样服务端和浏览器之间可以轻松地建立会话了。
但是我们想一下,我们现在采用的是分布式的系统,那么在用户服务进行登录之后,其他服务比如图书服务和借阅服务,它们会知道用户登录了吗?

实际上我们登录到用户服务之后,Session中的用户数据只会在用户服务的应用中保存,而在其他服务中,并没有对应的信息,但是我们现在希望的是,所有的服务都能够同步这些Session信息,这样我们才能实现在用户服务登录之后其他服务都能知道,那么我们该如何实现Session的同步呢?
- 我们可以在每台服务器上都复制一份Session,但是这样显然是很浪费时间的,并且用户验证数据占用的内存会成倍的增加。
- 将Session移出服务器,用统一存储来存放,比如我们可以直接在Redis或是MySQL中存放用户的Session信息,这样所有的服务器在需要获取Session信息时,统一访问Redis或是MySQL即可,这样就能保证所有服务都可以同步Session了(是不是越来越感觉只要有问题,没有什么是加一个中间件解决不了的)

那么,我们就着重来研究一下,然后实现2号方案,这里我们就使用Redis作为Session统一存储,我们把一开始的压缩包重新解压一次,又来从头开始编写吧。
这里我们就只使用Nacos就行了,和之前一样,我们把Nacos的包导入一下,然后进行一些配置:

现在我们需要为每个服务都添加验证机制,首先导入依赖:
<!-- SpringSession Redis支持 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<!-- 添加Redis的Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>然后我们依然使用SpringSecurity框架作为权限校验框架:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>接着我们在每个服务都编写一下对应的配置文件:
spring:
session:
# 存储类型修改为redis
store-type: redis
redis:
# Redis服务器的信息,该咋写咋写
host: 1.14.121.107这样,默认情况下,每个服务的接口都会被SpringSecurity所保护,只有登录成功之后,才可以被访问。
我们来打开Nacos看看:

可以看到三个服务都正常注册了,接着我们去访问图书服务:

可以看到,访问失败,直接把我们给重定向到登陆页面了,也就是说必须登陆之后才能访问,同样的方式去访问其他服务,也是一样的效果。
由于现在是统一Session存储,那么我们就可以在任意一个服务登录之后,其他服务都可以正常访问,现在我们在当前页面登录,登录之后可以看到图书服务能够正常访问了:

同时用户服务也能正常访问了:

我们可以查看一下Redis服务器中是不是存储了我们的Session信息:

虽然看起来好像确实没啥问题了,但是借阅服务炸了,我们来看看为什么:

在RestTemplate进行远程调用的时候,由于我们的请求没有携带对应SESSION的Cookie,所以导致验证失败,访问不成功,返回401,所以虽然这种方案看起来比较合理,但是在我们的实际使用中,还是存在一些不便的。
边栏推荐
猜你喜欢

MySQL玩到这种程度,难怪大厂抢着要!

Even if the image is missing in a large area, it can also be repaired realistically. The new model CM-GAN takes into account the global structure and texture details

小试牛刀:Go 反射帮我把 Excel 转成 Struct

4.爬虫之Scrapy框架2数据解析&配置参数&数据持久化&提高Scrapy效率

The pre-sale of the new Hyundai Paristi is open, and safety and comfort are not lost

IDEA connects to MySQL database and uses data

Network layer key protocol - IP protocol

C#高级--委托

DELL SC compellent 康贝存储系统怎么抓取配置信息

AI cocoa AI frontier introduction (7.31)
随机推荐
VU 非父子组件通信
Shell script classic case: detecting whether a batch of hosts is alive
[Blue Bridge Cup Trial Question 46] Scratch Magnet Game Children's Programming Scratch Blue Bridge Cup Trial Question Explanation
Shell project combat 1. System performance analysis
MySQL【聚合函数】
49.【拷贝构造函数与重载】
Node version switching management using NVM
The batch size does not have to be a power of 2!The latest conclusions of senior ML scholars
Solution for browser hijacking by hao360
Four ways to clear the float and its principle understanding
技能大赛训练题:登录安全加固
深度剖析 Apache EventMesh 云原生分布式事件驱动架构
Use of C# Assembly
Comparison of Optical Motion Capture and UWB Positioning Technology in Multi-agent Cooperative Control Research
MySQL 23 classic interviews hang the interviewer
MySQL has played to such a degree, no wonder the big manufacturers are rushing to ask for it!
How to quickly split and merge cell data in Excel
BigDecimal 简介,常用方法
Unity学习笔记 关于AVPro视频跳转功能(Seeking)的说明
Shell脚本经典案例:探测批量主机是否存活