gateway做token校验

这篇具有很好参考价值的文章主要介绍了gateway做token校验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文使用springcloud的gateway做token校验
登录的本质:拿用户名和密码 换 token。
token会返回给浏览器(存储),当访问的时候,携带token 发起请求。

  1. token校验图

gateway做token校验,spring,gateway,springcloud

  1. 引入redis依赖gateway做token校验,spring,gateway,springcloud

    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-redis</artifactId>
    		</dependency>
    
  2. token校验过滤器
    gateway做token校验,spring,gateway,springcloud

package com.example.filter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * token 校验
 */
@Component
public class TokenCheckFilter implements GlobalFilter, Ordered {//GlobalFilter全局过滤器,Ordered 顺序优先级

    @Autowired
    private StringRedisTemplate redisTemplate; //引入redis依赖,才能使用
    /**
     * 指定好放行的路径  (可以写在这,也可以写到配置文件中)
     * 白名单 (请求路径)
     */
    public static final List<String> ALLOW_URL = Arrays.asList("login-service/doLogin","/myUrl");

    /**
     *前提是? 和前端约定好,一般放在请求头中  key=Authorization, value=bearer token    (前缀:bearer+空格+token)
     * 1.拿到url  (GlobalFilter是全局过滤器,  但是,登录 没有token,要放行)
     * 2.判断放行   (登录+白名单 放行,不需要token)
     * 然后再校验token
     * 3.拿到 请求头
     * 4.拿到token
     * 5.校验 (看redis 中 有没有,如果没有就拦截,有就放行)
     * 6.放行/拦截
     *
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //拿到url    请求路径
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();
        if (ALLOW_URL.contains(path)){
            //放行
            return chain.filter(exchange);
        }
        //校验
        HttpHeaders headers = request.getHeaders(); //拿到请求头
        List<String> authorization = headers.get("Authorization");
        if (!CollectionUtils.isEmpty(authorization)){ //key不为空,取第一个
            String token = authorization.get(0);
            if (StringUtils.hasText(token)){ //token不空
                //约定好有前缀 bearer token
                String realToken = token.replaceFirst("bearer ", "");// replaceFirst替换字符串前面
                if (StringUtils.hasText(realToken) && redisTemplate.hasKey(realToken)){
                    //如果 请求头中 有token, 并且 redis中 有这个token(不带前缀)
                    //放行
                    return chain.filter(exchange);
                }
            }
        }

        //拦截
        ServerHttpResponse response = exchange.getResponse();
        response.getHeaders().set("content-type","application/json;charset=utf-8");

        HashMap<String, Object> map = new HashMap<>(4);
        //返回401
        map.put("code", HttpStatus.UNAUTHORIZED.value());
        map.put("msg","未授权");

        ObjectMapper objectMapper = new ObjectMapper();
        byte[] bytes = new byte[0]; //以字节形式 写到objectmapper
        try {
            bytes = objectMapper.writeValueAsBytes(map);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
        DataBuffer wrap = response.bufferFactory().wrap(bytes);
        return response.writeWith(Mono.just(wrap));

    }

    @Override
    public int getOrder() {
        return 2; //先校验ip,再校验token
    }
}

  1. 流程:

    前提: 和前端约定好
    token一般放在请求头中 key=Authorization, value=bearer token
    (前缀:bearer+空格+token)文章来源地址https://www.toymoban.com/news/detail-637937.html

    • 1.拿到url (GlobalFilter是全局过滤器, 但是,登录 没有token,要放行)
    • 2.判断放行 (登录+白名单 放行,不需要token)
    • 然后再校验token
    • 3.拿到 请求头
    • 4.拿到token
    • 5.校验 (看redis 中 有没有,如果没有就拦截,有就放行)
    • 6.放行/拦截

到了这里,关于gateway做token校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Gateway、Sa-Token、nacos完成认证/鉴权

    之前进行鉴权、授权都要写一大堆代码。如果使用像Spring Security这样的框架,又要花好多时间学习,拿过来一用,好多配置项也不知道是干嘛用的,又不想了解。要是不用Spring Security,token的生成、校验、刷新,权限的验证分配,又全要自己写,想想都头大。 Spring Security太重

    2024年02月09日
    浏览(43)
  • SpringGateway网关(Spring Gateway是Spring自己编写的,也是SpringCloud中的组件)

    目录 SpringGateway网关 奈非框架简介 什么是网关 网关的主要功能有 Spring Gateway简介 网关路由配置 动态路由 早期(2020年前)奈非提供的微服务组件和框架受到了很多开发者的欢迎 这些框架和SpringCloud Alibaba的对应关系我们要了解 现在还有很多旧项目维护是使用奈非框架完成的微

    2024年02月09日
    浏览(47)
  • 【springcloud 微服务】Spring Cloud 微服务网关Gateway使用详解

    目录 一、微服务网关简介 1.1 网关的作用 1.2 常用网关 1.2.1 传统网关 1.2.2 云原生网关

    2023年04月16日
    浏览(51)
  • 【SpringCloud】11、Spring Cloud Gateway使用Sentinel实现服务限流

    1、关于 Sentinel Sentinel 是阿里巴巴开源的一个流量防卫防护组件,可以为微服务架构提供强大的流量防卫能力,包括流量控制、熔断降级等功能。Spring Cloud Gateway 与 Sentinel 结合,可以实现强大的限流功能。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近

    2024年02月01日
    浏览(55)
  • Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】

    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转 Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转 Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转 Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转 Java之SpringCloud Alibaba【五】【微服务

    2024年02月06日
    浏览(60)
  • SpringCloud - Spring Cloud 之 Gateway网关,Route路由,Predicate 谓词/断言,Filter 过滤器(十三)

    阅读本文前可先参考 ​​​​​​SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 SpringCloud - Spring Cloud 之 Gateway网关(十三)_MinggeQingchun的博客-CSDN博客 Web 有三大组件(监听器 过滤器 servlet),Spring Cloud GateWay 最主要的功能就是路由转发,而在定义

    2024年02月14日
    浏览(65)
  • 如何生成以及校验token

    目录 1️⃣ What is token?         2️⃣ Why do we use token? 3️⃣ token组成(Composition of token) 4️⃣ 校验token(Verify token) 5️⃣ 实操: 生成token(Generate token) 校验token(Verificationtoken)  token是令牌的意思,作用就像“通关令牌”一样,持有token的请求会被“放行”,不持有

    2024年02月01日
    浏览(28)
  • 手动搭建gateway,项目集成gateway实现Token效果

    现在想要进行token校验,故引入gateway服务。 首先阅读官网,知道概念:Gateway官网详解 看整体的目录结构 这份配置是用于Spring Cloud Gateway的配置文件,用于构建API网关。让我来解释一下每个部分的含义: 服务器配置: 服务器监听端口为8088。 Servlet的上下文路径设置为\\\"/api\\\",

    2024年02月15日
    浏览(39)
  • JWT主动校验Token是否过期

    JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案 在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP 协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个 request 请求时它就把刚刚的资料忘了。于是我们的程序就不知道谁是谁

    2024年02月09日
    浏览(68)
  • 权限校验中的“双token”方案

    注:refresh_token的过期时间一般比access_token的过期时间长一倍,甚至更长 在以前,我们设计单token的方案进行token过期刷新,一旦这个token泄露,不法分子就可以无限进行token刷新,从而造成无法挽回的后果。

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包