0. 代办

  1. 若请求是需转发其他的服务,没问题。如果请求的就是本服务自己呢?我发现请求/actutor/**有问题会报错未授权(免密验证的请求)

1. 需求

  1. web项目后台框架spring cloud,前后端交互的接口调用统一由gateway组件进行路由。添加登录验证功能,控制访问权限。

2 . 实现,本文只提供代码,不看原理

网上大部分都是security servlet版本的,本版本是webflux版本 ,注意区分。在整合时候也有很多坑,建议看spring.io官网教程。本demo是简单的实现,供参考使用。末尾会附上项目源码

1. springcloud版本

<spring-boot.version>2.1.18.RELEASE</spring-boot.version>
<spring-cloud.version>Greenwich.SR6</spring-cloud.version>
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-dependencies</artifactId>
     <version>${spring-boot.version}</version>
     <type>pom</type>
     <scope>import</scope>
 </dependency>
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-dependencies</artifactId>
     <version>${spring-cloud.version}</version>
     <type>pom</type>
     <scope>import</scope>
 </dependency>
 <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-security</artifactId>
  </dependency>

2. security为webflux版本

因为gateway框架使用的是netty的webflux技术,不是springmvc的servlet。
security有两个版本,一个是sevlet,一个是webflux

3. security配置代码

  1. 核心是配置org.springframework.security.web.server.SecurityWebFilterChain对象
    在这里插入图片描述

  2. 用户登录时执行流程:security直接调用findByUsername(String username)方法,返回对象包含数据库查询出的用户账号和密码,然后和用户录入的账号密码比较验证。验证成功或失败都会调用上图的对应方法。当登录成功后会把token返回给前端,后续的调用业务接口都会把token携带上进行。
    在这里插入图片描述

  3. 用户登录成功后携带token调用业务接口流程:security认证逻辑,调用load(ServerWebExchange exchange)方法验证
    在这里插入图片描述

  4. 当验证完成账户密码成功后,进行权限验证,判断请求的路径是否有权限访问
    在这里插入图片描述
    上图的是否 2、3是我自定义的角色,在查询数据库用户账户密码时候,也查询了角色,并且一起封装到UserDetails对象中
    在这里插入图片描述

3. 项目源码gitee

https://gitee.com/shenshuxin01/ssx-java-idea/tree/gateway_security_demo/gateway-server

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐