当前位置:网站首页>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,所以虽然这种方案看起来比较合理,但是在我们的实际使用中,还是存在一些不便的。
边栏推荐
猜你喜欢
ICML2022 | Fully Granular Self-Semantic Propagation for Self-Supervised Graph Representation Learning
IDEA connects to MySQL database and uses data
MySQL玩到这种程度,难怪大厂抢着要!
搭建私有的的Nuget包服务器教程
对数字化时代的企业来说,数据治理难做,但应该去做
代码随想录笔记_哈希_454四数相加II
Miller_Rabin Miller Rabin probability sieve [template]
尚硅谷-JVM-内存和垃圾回收篇(P1~P203)
C# Get network card information NetworkInterface IPInterfaceProperties
Uniapp WeChat small application reference standard components
随机推荐
Shell project combat 1. System performance analysis
mysql8, starttime的下一个值作为endtime的上一个值?
“听我说谢谢你”还能用古诗来说?清华搞了个“据意查句”神器,一键搜索你想要的名言警句...
以后面试官问你 为啥不建议使用Select *,请你大声回答他!
AWS implements scheduled tasks - Lambda+EventBridge
Shell script classic case: detecting whether a batch of hosts is alive
[QNX Hypervisor 2.2 User Manual] 9.13 rom
MySQL【聚合函数】
A detailed guide to simulating latency with SQL/JDBC
深度剖析 Apache EventMesh 云原生分布式事件驱动架构
已解决(pymysqL连接数据库报错)pymysqL.err.ProgrammingError: (1146,“Table ‘test.students‘ doesn‘t exist“)
AI cocoa AI frontier introduction (7.31)
Install the latest pytorch gpu version
C语言基础练(九九乘法表)与打印不同星号图案
Resnet&API
Miller_Rabin 米勒拉宾概率筛【模板】
Numbers that appear only once in LeetCode
232层3D闪存芯片来了:单片容量2TB,传输速度提高50%
In the future, the interviewer asks you why it is not recommended to use Select *, please answer him out loud!
「面经分享」西北大学 | 字节 生活服务 | 一面二面三面 HR 面