本文主要内容是通过SpringCloud Gateway构建一个网关微服务,作为统一的认证授权和访问入口。

配置文件

先引入相关依赖,对应的pom文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>oauth2-demo</artifactId><groupId>com.zjq</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ms-gateway</artifactId><dependencies><!-- spring cloud gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- eureka client --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- commons 公共项目 --><dependency><groupId>com.zjq</groupId><artifactId>commons</artifactId><version>1.0-SNAPSHOT</version><!-- 和 webflux 冲突 --><exclusions><exclusion><groupId>com.battcn</groupId><artifactId>swagger-spring-boot-starter</artifactId></exclusion></exclusions></dependency><!-- 自定义的元数据依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency></dependencies></project>

网关服务的yml配置内容如下:

server:port: 80spring:application:name: ms-gatewaycloud:gateway:discovery:locator:enabled: true # 开启配置注册中心进行路由功能lower-case-service-id: true # 将服务名称转小写routes:- id: ms-usersuri: lb://ms-userspredicates:- Path=/users/**filters:- StripPrefix=1- id: ms-oauth2-serveruri: lb://ms-oauth2-serverpredicates:- Path=/auth/**filters:- StripPrefix=1secure:ignore:urls: # 配置白名单路径- /actuator/**- /auth/oauth/**- /users/signin# 配置 Eureka Server 注册中心
eureka:instance:prefer-ip-address: trueinstance-id: ${spring.cloud.client.ip-address}:${server.port}client:service-url:defaultZone: http://localhost:7000/eureka/logging:pattern:console: '%d{HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n'

请求白名单配置

加载配置文件中的配置,注入到spring容器中。

secure:ignore:urls: # 配置白名单路径- /actuator/**- /auth/oauth/**- /users/signin
/*** 网关白名单配置* @author zjq*/
@Data
@Component
@ConfigurationProperties(prefix = "secure.ignore")
public class IgnoreUrlsConfig {private List<String> urls;}

异常处理和rest请求配置

异常处理在全局过滤器中会有用到,代码如下:

@Component
public class HandleException {@Resourceprivate ObjectMapper objectMapper;public Mono<Void> writeError(ServerWebExchange exchange, String error) {ServerHttpResponse response = exchange.getResponse();ServerHttpRequest request = exchange.getRequest();response.setStatusCode(HttpStatus.OK);response.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);ResultInfo resultInfo = ResultInfoUtil.buildError(ApiConstant.NO_LOGIN_CODE, ApiConstant.NO_LOGIN_MESSAGE, request.getURI().getPath());String resultInfoJson = null;DataBuffer buffer = null;try {resultInfoJson = objectMapper.writeValueAsString(resultInfo);buffer = response.bufferFactory().wrap(resultInfoJson.getBytes(Charset.forName("UTF-8")));} catch (JsonProcessingException ex) {ex.printStackTrace();}return response.writeWith(Mono.just(buffer));}}

申请授权和认证过程中需要远程调用其他接口,所以我们引入rest请求配置,代码如下:

/*** REST请求配置* @author zjq*/
@Configuration
public class RestTemplateConfiguration {@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}}

全局过滤器配置

配置好了白名单,我们需要在网关过滤器中使用该白名单配置,放行对应的白名单,网关过滤器需要实现全局过滤器接口org.springframework.cloud.gateway.filter.GlobalFilter和过滤器顺序接口org.springframework.core.Ordered相关代码如下:

/*** 网关全局过滤器* @author zjq*/
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {@Resourceprivate IgnoreUrlsConfig ignoreUrlsConfig;@Resourceprivate RestTemplate restTemplate;@Resourceprivate HandleException handleException;/*** 身份校验处理** @param exchange* @param chain* @return*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 判断当前的请求是否在白名单中AntPathMatcher pathMatcher = new AntPathMatcher();boolean flag = false;String path = exchange.getRequest().getURI().getPath();for (String url : ignoreUrlsConfig.getUrls()) {if (pathMatcher.match(url, path)) {flag = true;break;}}// 白名单放行if (flag) {return chain.filter(exchange);}// 获取 access_tokenString access_token = exchange.getRequest().getQueryParams().getFirst("access_token");// 判断 access_token 是否为空if (StringUtils.isBlank(access_token)) {return handleException.writeError(exchange, "请登录");}// 校验 token 是否有效String checkTokenUrl = "http://ms-oauth2-server/oauth/check_token?token=".concat(access_token);try {// 发送远程请求,验证 tokenResponseEntity<String> entity = restTemplate.getForEntity(checkTokenUrl, String.class);// token 无效的业务逻辑处理if (entity.getStatusCode() != HttpStatus.OK) {return handleException.writeError(exchange,"Token was not recognised, token: ".concat(access_token));}if (StringUtils.isBlank(entity.getBody())) {return handleException.writeError(exchange,"This token is invalid: ".concat(access_token));}} catch (Exception e) {return handleException.writeError(exchange,"Token was not recognised, token: ".concat(access_token));}// 放行return chain.filter(exchange);}/*** 网关过滤器的排序,数字越小优先级越高** @return*/@Overridepublic int getOrder() {return 0;}}

测试验证

登录:

获取当前登录用户信息:

退出登录:

本文内容到此结束了,
如有收获欢迎点赞

SpringCloud Gateway网关为认证中心和用户微服务构建统一的认证授权入口相关推荐

  1. 微服务架构统一安全认证设计与实践

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 当企业应用系统逐 ...

  2. 企业级微服务架构统一安全认证设计与实践!

    来源:mars | https://juejin.cn/post/6906149001520037902 名词定义 Third-party application:第三方应用程序,本文中又称" ...

  3. 一文揭秘微服务架构统一安全认证设计与实践!

    作者:mars 链接:https://juejin.cn/post/6906149001520037902 -     前言     - 当企业应用系统逐渐增多后,每个系统单独管理各自的用户数据容易形 ...

  4. Spring Cloud 与微服务学习总结(16)—— 微服务架构统一安全认证设计与实践

    前言 当企业应用系统逐渐增多后,每个系统单独管理各自的用户数据容易形成信息孤岛,分散的用户管理模式阻碍了企业应用向平台化演进.当企业的互联网业务发展到一定规模,构建统一的标准化账户管理体系将是必不可少 ...

  5. 4.从零开始搭建基于SpringCloud的京东整站_用户微服务_后台登录鉴权

    本次目标 实现后台登录鉴权功能. 接口文档 1.后台管理员登录 页面访问地址:http://admin/pages/main/login.html 2.接口描述 js请求地址 http://{ip:p ...

  6. SpringCloud系列教程(五)之SpringCloud Gateway 网关聚合开发文档 swagger knife4j 和登录权限统一验证【Hoxton版】

    阅读提醒: 本文面向的是有一定springboot基础者 本次教程使用的Spring Cloud Hoxton RELEASE版本 由于knife4j比swagger更加友好,所以本文集成knife4 ...

  7. SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务)

    2019独角兽企业重金招聘Python工程师标准>>> SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务) 一.大致介绍 微服务与微服务之间通过 ...

  8. 【Spring Cloud Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间这里只贴出关键部分代码的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证 ...

  9. 《深入理解 Spring Cloud 与微服务构建》第十一章 服务网关

    <深入理解 Spring Cloud 与微服务构建>第十一章 服务网关 文章目录 <深入理解 Spring Cloud 与微服务构建>第十一章 服务网关 一.服务网关简介 二. ...

  10. SpringCloud(第 016 篇)电影微服务,定制Feign,一个Feign功能禁用Hystrix,另一个Feign功能启用Hystrix...

    2019独角兽企业重金招聘Python工程师标准>>> SpringCloud(第 016 篇)电影微服务,定制Feign,一个Feign功能禁用Hystrix,另一个Feign功能 ...

最新文章

  1. LeetCode简单题之增量元素之间的最大差值
  2. ASP.NET MVC3 301永久重定向实现程序
  3. springboot集成Apollo分布式配置
  4. Acwing 218. 扑克牌
  5. sql:数据操作语言dml
  6. 大数据时代下的信息安全
  7. netsetman使用教程_NetSetMan配置网络参数教程
  8. 用透明屏+pH电极做一个pH计
  9. cpu和内存占用过高,但是任务管理器中的进程占用的内存和cpu看不出来
  10. 大数据开发面试准备——计算机网络
  11. 物流快递信息查询管理系统网站(JSP+HTML+MySQL)
  12. react中副作用函数(useEffect)详解
  13. Moamen and XOR
  14. 预定义类型未定义或导入_【小程序】商家来看看,常见的微信小程序类型有哪些?...
  15. python 监目录文件变动,然后在做些其它的操作,watchdog 详细解答
  16. js实现移动端电子签名
  17. Spring和SpringMVC架构
  18. vmware——vsphere 安装图形界面出现双鼠标问题(vsphere client 5.5)
  19. 物理服务器Linux下软RAID和UUID方式挂载方法--Megacli64
  20. 【直播回顾】Hello HarmonyOS应用篇第六课——短视频应用开发

热门文章

  1. mysql的cnf配置文件全解析
  2. Absolute Enable Right Click Copy 简单快速解除滑鼠右键使用限制
  3. matlab专区--------------matlab里面如何保留小数特定位数
  4. Excel中使用条件格式(比较两列将内容不同用颜色标识)
  5. mysql error 1114_ERROR 1114 (HY000): The table 'ds_data' is full (innodb_data_file_path)
  6. OJ 2530: 小勇玩lol
  7. python xlrd读取excel慢_与xlrd相比,使用openpyxl读取Excel文件要慢很多
  8. 用python祝福父亲节_父亲节送给父亲的祝福语,挑一句话发朋友圈!
  9. 中兴手机怎么与计算机连接网络连接不上,中兴手机怎么连接电脑
  10. android 国际化