当前位置:网站首页>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,所以虽然这种方案看起来比较合理,但是在我们的实际使用中,还是存在一些不便的。
边栏推荐
- 【Pytorch】torch.argmax()用法
- Nuget打包并上传教程
- IDEA can't find the Database solution
- ECCV 2022 | Robotic Interaction Perception and Object Manipulation
- ADS communicate with c #
- leetcode:485.最大连续 1 的个数
- VU 非父子组件通信
- A detailed explanation of the usage of Async and Await in C#
- Numbers that appear only once in LeetCode
- C#高级--委托
猜你喜欢
Install the latest pytorch gpu version
AWS implements scheduled tasks - Lambda+EventBridge
Samba 远程命令执行漏洞(CVE-2017-7494)
C# control StatusStrip use
以后面试官问你 为啥不建议使用Select *,请你大声回答他!
ADS communicate with c #
推荐系统-召回阶段-2013:DSSM(双塔模型)【Embedding(语义向量)召回】【微软】
Analysis of the startup source code of hyperf (2) - how the request reaches the controller
STM32的CAN过滤器
hyperf的启动源码分析(二)——请求如何到达控制器
随机推荐
MySQL【聚合函数】
leetcode:2032. 至少在两个数组中出现的值
jOOQ 3.14 released - SQL/XML and SQL/JSON support
“听我说谢谢你”还能用古诗来说?清华搞了个“据意查句”神器,一键搜索你想要的名言警句...
技能大赛训练题:MS15_034漏洞验证与安全加固
Shell脚本经典案例:文件的备份
小试牛刀:Go 反射帮我把 Excel 转成 Struct
技能大赛训练题:交换机的远程管理
Unity study notes Description of AVPro video jump function (Seeking)
C# using NumericUpDown control
[QNX Hypervisor 2.2用户手册]9.13 rom
Tortoise speed by "template"
SetoolKit使用指南
49. The copy constructor and overloaded 】
Detailed explanation of network protocols and related technologies
LeetCode rotate array
For enterprises in the digital age, data governance is difficult, but it should be done
LeetCode旋转数组
Shell project combat 1. System performance analysis
页面整屏滚动效果