一、背景介绍:

之前做微服务项目的时候鉴权操作都放在了各个服务中,每个服务都集成了spring security或者shiro框架或者写拦截器自己做鉴权操作,最近刚好有时间实现一下网关统一鉴权。之前:

在这里插入图片描述
统一鉴权之后服务呢就是单纯提供资源的服务了,叫资源服务。
在这里插入图片描述
鉴权操作一般都是有个单独的授权服务,实现方式:
1、网关调用授权服务的鉴权接口
2、网关和授权服务连接同一个redis
3、token使用jwt
个人感觉第一种方式不太可取,访问资源的每个接口网关都需要调用下授权服务有点鸡肋,增加了授权服务的压力,我选择2和3两种方式进行了实现,只不过使用jwt方式想要主动使此token过期功能则需要另外实现,jwt生成时就已经规定了什么时间过期。

二、授权认证时序图

在这里插入图片描述
这是第二种实现方式,网关和授权服务连接同一个redis,第三种就是除了没有redis其他流程一样,所以这也是统一鉴权其中一种好处,换框架换校验方式等只需要修改网关就行了。
流程:
① 用户申请令牌(可理解为登录)
② 授权服务颁发令牌(登陆成功返回token)
③ 用户拿到令牌去访问接口 (前端把token放到请求头)
④ 网关鉴权(接口级别的权限,有访问权限则把用户信息通过redis或者jwt解析出来,再通过base64加密或者其他加密算法把用户信息加密,如果资源服务不对外暴露全是内网用base64就行了,速度快,我使用的是AES对称加密)
⑤ 资源服务解析用户信息并生成上下文(解析并提供一个静态工具类能获得当前用户的信息方便业务使用)

三、实现

1、使用框架

  • spring-boot 2.6.3
  • spring-cloud 2021.0.1
  • spring-cloud-alibaba 2021.0.1.0
  • hutool 5.8.5
  • sa-token 1.30.0

其中sa-token是国产的一个轻量级 java 权限认证框架,个人对比spring security、shiro框架感觉:功能丰富、使用简便、方式优雅,官方文档清晰现在已经万级star。
微服务组件本次只使用了网关gateway、注册中心nacos、服务调用openfeign、负载均衡loadbalancer只是为了实现统一鉴权功能其他组件暂市没使用。

2、项目结构

https://gitee.com/china-zhz/cloud.git
其中dev-redis是redis版本,dev-jwt是jwt版本
在这里插入图片描述

  • cloud-common 公共工具类、枚举、常量等
  • cloud-config 公共配置
  • cloud-gateway 网关服务
  • cloud-server-auth 授权服务
    • auth-api 授权服务对外暴露的feign接口
    • auth-web 授权服务web
  • cloud-server-order 订单服务
  • cloud-token token模块
    因为每个资源服务都需要解析网关传来的用户封装信息,我把解析逻辑和生成上下文逻辑抽出了一个公共的cloud-token模块。

3、项目使用

① 启动网关服务、授权服务、订单资源服务
② 登录不经过网关的登录接口是
http://localhost:8081/auth/login?username=zhz&password=12345
经过网关登录接口是
http://localhost:8080/api-auth/auth/login?username=zhz&password=12345
③ 拿到登录接口返回的token请求经过网关订单服务资源接口(放入请求头)
http://localhost:8080/api-order/order/info
header key是Authorization 值是登录接口获得的token值
因为我网关配置了此接口需要order-info权限,登录授权给到的是order-order-info权限码所以返回没有权限访问。
至此网关统一鉴权实现结束。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐