单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,不再共享数据。也就意味着每个微服务都需要做身份校验,这显然不可取。
我们的登录是基于JWT来实现的,校验JWT的算法复杂,而且需要用到密钥。如果每个微服务都去做身份校验,这就存在着两大问题:
● 每个微服务都需要知道JWT的密钥,不安全。
● 每个微服务重复编写身份校验代码、权限校验代码,代码重复不易维护。
既然网关是所有微服务的入口,一切请求都需要先经过网关。我们完全可以把身份校验的工作放到网关去做,这样之前说的问题就解决了:
● 只需要在网关和用户服务保存秘钥
● 只需要在网关开发身份校验功能
网关鉴权是指在网关对请求进行身份验证的过程。这个过程确保只有经过授权的用户或设备才能访问特定的服务或资源。
流程如下:
- 用户登录成功生成token并存储在前端
- 前端携带token访问网关
- 网关解析token中的用户信息,网关将请求转发到微服务,转发时携带用户信息
- 微服务从http头信息获取用户信息
- 微服务之间远程调用使用内部接口(无状态接口,即后端微服务集群都不做权限校验)
网关鉴权除了验证token的合法性还有一层含义是校验用户的权限,通常校验用户的权限不放在网关而是放在微服务去实现,因为具体的接口在微服务,在token中包括了用户的权限字符串,微服务接收到权限字符串通过spring security框架进行拦截实现,具体的方案就是在controller接口上通过下边的注解实现:
hasAuthority('authority'): 检查是否有指定的权限(authority),这通常与数据库中的权限字符串对应,可通过AI学习spring security框架(当然我们中州就已经学了,所以这块就很明晰):
AI:spring security授权注解有哪些
AI:@PreAuthorize("hasRole('ADMIN')") 除了hasRole还有哪些