SpringCloud初体验:七、gateway 网关服务如何做token验证

说说背景:假如有一个用户服在用户登录后,生成一个token给到客户端,用户每次请求时都需要这个token,于是每次都会在网关 gateway 校验,校验通过后网关从token中解析出userId,然后将userId送到各个服务。

比如现在有一个 java 服务 和 一个 php 服务,从网关访问的URL 分别是 http://127.0.0.1:8201/java/ 和 http://127.0.0.1:8201/php/,现在暂时只需对 php 这个服务验证,先看效果图

spring cloud gateway 的官网文档地址:http://cloud.spring.io/spring-cloud-gateway/single/spring-cloud-gateway.html#_addrequestheader_gatewayfilter_factory

一、需要自定义 GatewayFilterFactory 继承  AbstractGatewayFilterFactory 抽象类,代码如下:

package cn.taxiong.tx_api_gateway_server.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpResponse;
import reactor.core.publisher.Mono;

/**
 * JWT验证的过滤器
 *
 * @author [email protected]
 * @create 2018-09-09 下午10:05
 **/
public class JwtCheckGatewayFilterFactory  extends AbstractGatewayFilterFactory<JwtCheckGatewayFilterFactory.Config> {

    public JwtCheckGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            String jwtToken = exchange.getRequest().getHeaders().getFirst("Authorization");
            //校验jwtToken的合法性
            if (jwtToken != null) {
                // 合法
                // 将用户id作为参数传递下去
                return chain.filter(exchange);
            }

            //不合法(响应未登录的异常)
            ServerHttpResponse response = exchange.getResponse();
            //设置headers
            HttpHeaders httpHeaders = response.getHeaders();
            httpHeaders.add("Content-Type", "application/json; charset=UTF-8");
            httpHeaders.add("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
            //设置body
            String warningStr = "未登录或登录超时";
            DataBuffer bodyDataBuffer = response.bufferFactory().wrap(warningStr.getBytes());

            return response.writeWith(Mono.just(bodyDataBuffer));
        };
    }

    public static class Config {
        //Put the configuration properties for your filter here
    }
}

二、需要将自定义的 GatewayFilterFactory 注入到Spring 中

package cn.taxiong.tx_api_gateway_server.config;

import cn.taxiong.tx_api_gateway_server.filter.JwtCheckGatewayFilterFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 应用配置
 *
 * @author [email protected]
 * @create 2018-09-09 下午10:57
 **/
@Configuration
public class AppConfig {
    @Bean
    public JwtCheckGatewayFilterFactory jwtCheckGatewayFilterFactory(){
        return new JwtCheckGatewayFilterFactory();
    }
}

三、网关服务的配置文件中配置 自定义过滤器 生效的服务

这里只配置了 php 这个服务,java 这个服务不使用这个过滤器规则

原文地址:https://www.cnblogs.com/liugx/p/9615910.html

时间: 2024-08-26 01:36:43

SpringCloud初体验:七、gateway 网关服务如何做token验证的相关文章

Spring Cloud gateway 网关服务二 断言、过滤器

微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring Cloud alibaba只需要你学会一个就会拥有俩种微服务治理框架技术.何乐而不为呢?加油吧!骚猿年 上一篇我们讲述了gateway 的路由功能其实也类似与zuul服务的路由转发. 今天主要讲一下断言机制. 内置的断言工厂 介绍 Spring Cloud Gateway将路由作为Spring Web

springCloud学习05之api网关服务zuul过滤器filter

前面学习了zuul的反向代理.负载均衡.fallback回退.这张学习写过滤器filter,做java web开发的对filter都不陌生,那就是客户端(如浏览器)发起请求的时候,都先经过过滤器filter做一些相关的校验或业务判断(如登录.权限等),zuul也同样提供了过滤器功能.只要继承ZuulFilter类即可. 通过前文的介绍,我们对于Zuul的第一印象通常是这样的:它包含了对请求的路由和过滤两个功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础:而过

初体验之开源Git服务Gogs

gogs搭建教程 是否觉得Gitlab吃内存?是否觉得高富帅和diao丝直接差的是服务器配置?推荐一款开源的git服务器Gogs,从此翻身做富帅; Gogs具有占用内存小,速度快,并发高的特点:1核2G云服务器稳稳带起: 在我体验完Gogs给我带来的快感以后,不得不说go是门迷人的语言: 废话不多说,开始我们的安装教程: gogs宗旨 Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支

XenApp / XenDesktop 7.6 初体验七 policies (上)

到目前为止,Xen 7.6 基本的结构我都尝试搭建过了,现在看看一个重难点 Policies. Xen7 里面有上百个Policy可以配置,不同的配置用户体验可能完全不同. Citrix的Policy的执行顺序如下: 1.Local GPO 2.XenDesktop/XenApp Site GPO 3.Site-level GPO 4.Domain-level GPO 5.OU-level GPO 如果有冲突,后面执行的GPO可以覆盖之前GPO的内容 Xen7里面有2个地方都可以配置Polici

dubbo和shiro的整合,在服务端做权限验证

基于dobbo做服务开发后通常会遇上这样一些问题,举个例子:用户的笔记,涉及到CRUD 4个接口,是每一个接口中都要把用户传进去么?比如:删除接口定义为 noteService.deleteById(Long noteId)还是 noteService.deleteById(Long userId, Long noteId)如果是前者,这个时候如果不验证用户对资源是否有权限直接删除是否合理,尤其是这种可能被用户猜到的ID很容易被恶意调用.如果选第二种的话,那么有很多接口都要这样定义,感觉不够美观

SpringCloud之网关服务(gateway)

前言 网关服务在SpringCloud中有很重要的作用. 可以将服务跟外网进行隔离起到一定的保护作用,同时服务间局域网通信更加快捷.而且在网关中可以做限流.权限校验,使得服务更加专注自身业务.比如说下订单需要登录权限,限流,我们在本篇将介绍如何使用. 搭建网关项目 注意:需要添加Eureka Discovery,Zuul路由组件. 1.入口添加@EnableZuulProxy注解 2.配置文件 server: port: 9000 #指定注册中心地址 eureka: client: servic

SpringCloud Feign 之 Fallback初体验

SpringCloud Feign 之 Fallback初体验 在微服务框架SpringCloud中,Feign是其中非常重要且常用的组件.Feign是声明式,模板化的HTTP客户端,可以帮助我们更方便快捷调用HTTP API.本文主要针对Feign的熔断机制Fallback进行简单介绍.Fallback主要是用来解决依赖的服务不可用或者调用服务失败或超时,使用默认的返回值. 1.引入Feign pom依赖包 <dependency> <groupId>org.springfram

【阿里云产品公测】弹性伸缩服务ESS之试用初体验

T>>c2$ x 弹性伸缩服务ESS之试用初体验 作者:云郎 2014/10/15 阿里云弹性伸缩服务(Elastic Scaling Service)是根据用户的业务需求和策略,自动调整其弹性计算服务器(ECS)的管理服务.其能够在业务增长时自动增加ECS实例,并在业务下降时自动减少ECS实例. 收到ESS开始公测的邀请,马上怕不急待的申请了公测资格,开始体验传说中的ESS云服务了.因为笔者一直在全面的测试阿里云产品,在做压测过程中经常需要动态的调整ECS云主机的数量以确保能够给RDS提供合

Linux初体验之练习篇(七)

Linux初体验之练习篇(七) tr IO重定向 神奇的自动挂载 tr 主要用途 转换或删除字符 tr - translate or delete characters tr [OPTION]... SET1 [SET2] tr命令是一个强大的字符转换工具,可以对来自标准输入的字符进行各种转换,包括字符集对应转换.删除或都取字符补集.压缩和格式调整.格式调整包括换行.回车.加入制表符等. 常用参数 -c, -C: --complemen, 取字符集的补集 -d: --delete, 删除所有属于