首页 > 其他分享 >SpringCloud Gateway鉴权

SpringCloud Gateway鉴权

时间:2024-09-02 16:14:50浏览次数:11  
标签:令牌 return SpringCloud springframework 鉴权 token org import Gateway

参考:https://blog.csdn.net/weixin_43296313/article/details/121126811
基于从前的项目:https://www.cnblogs.com/xsj1989/p/18350213
在网关项目下创建全局过滤器

package com.xcg.filters;

import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.xcg.common.JwtUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
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.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Map;
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    //自定密钥,最好搞长一点
    public static final String TokenKey = "8FA593CF2445AB0A0AF1F173641583AB";
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1. 获取请求
        ServerHttpRequest request = exchange.getRequest();
        //2. 则获取响应
        ServerHttpResponse response = exchange.getResponse();
        //3. 如果是登录请求则放行
        if (request.getURI().getPath().contains("/UserLogin")) {
            return chain.filter(exchange);
        }
        //4. 获取请求头
        HttpHeaders headers = request.getHeaders();
        //5. 请求头中获取令牌
        String token = headers.getFirst("Authorization");
        //6. 判断请求头中是否有令牌
        if (StringUtils.isEmpty(token)) {
            //7. 响应中放入返回的状态吗, 没有权限访问
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            //8. 返回
            return response.setComplete();
        }
        token = token.toString().replace("Bearer ","");

        //9. 如果请求头中有令牌则解析令牌
        try {
            //校验token,不正确会报异常。
            DecodedJWT verify = JwtUtil.verify(token);
            Map<String, Claim> claims = verify.getClaims();
            var sysUserId = Integer.parseInt(claims.get("SysUserId").asString());
            if (sysUserId > 0){
                //其他判断,例如权限。
            }
        } catch (Exception e) {
            e.printStackTrace();
            //10. 解析jwt令牌出错, 说明令牌过期或者伪造等不合法情况出现
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            //11. 返回
            return response.setComplete();
        }
        //12. 放行
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

第三步排除掉免登录的请求,其他请求都会校验登录票证。不通过就返回401状态码。

标签:令牌,return,SpringCloud,springframework,鉴权,token,org,import,Gateway
From: https://www.cnblogs.com/xsj1989/p/18392891

相关文章

  • 基于.NET开源、免费的跨平台物联网网关:IoTGateway
    一个.NET开源、免费的跨平台物联网网关  前言今天大姚给大家分享一个基于.NET开源、免费的跨平台物联网网关:IoTGateway。项目介绍IoTGateway是一个基于.NET6的跨平台物联网网关。通过可视化配置,轻松的连接到你的任何设备和系统(如PLC、扫码枪、CNC、数据库、串口设备、上位......
  • springcloud
    SpringCloudidea微服务项目导入,maven加载过慢方法1方法2简单理解就是将不同功能controller分为两个接口供外部使用......
  • 四博智联OpenMQTTGateway蓝牙网关,支持100多种蓝牙传感器
    以下是一篇关于OpenMQTTGateway的软文,包含了相关图片,以更好地展示该项目的功能和优势。模组规格OpenMQTTGateway:一站式解决物联网协议整合的强大工具OpenMQTTGateway是一个开源项目,旨在将多种不同的物联网协议整合到一个统一的固件中。通过这一创新性的解决方案,开发......
  • 基于.NET开源、免费的跨平台物联网网关:IoTGateway
    思维导航前言项目介绍项目源代码项目演示项目源码地址优秀项目和框架精选前言今天大姚给大家分享一个基于.NET开源、免费的跨平台物联网网关:IoTGateway。项目介绍IoTGateway是一个基于.NET6的跨平台物联网网关。通过可视化配置,轻松的连接到你的任何设备和系统(如PLC、......
  • ASP.Net8 中使用 JWT 鉴权的异常处理
    .Net8中使用JWT鉴权的异常处理自己搭了个学习Demo想用JWT給后端做鉴权,结果一直报一些奇奇怪怪的异常,最主要是和写业务代码不一样,因为用了官方提供的包很难排查出问题所在,这次有点像以前学Spring的时候,也是一点一点摸着石头过河,最后还是同事帮忙看出来问题在哪的。问题1:I......
  • Java语言-SpringCloud架构-EMS能源管理系统(水-电-气-热-油等数据采集分析系统)
    Java语言-SpringCloud架构-EMS能源管理系统(水-电-气-热-油等数据采集分析系统)介绍适用于高能耗企业、建筑、工厂、园区的水、电、气、热、油、空压机等能源数据采集、分析、报表;基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud......
  • 【SpringCloud】idea如何实现微服务多开
    背景:当需要使用相同的配置启动多个服务且host相同时,就需要在命令行指定不同的端口,但是springcloud中远程配置默认会覆盖所有本地参数,所以需要修改默认覆盖优先级一、默认优先级 二、配置远程配置优先级低于本地系统参数#是否允许本地配置覆盖远程配置spring.cloud.config......
  • 【java计算机毕设】网上商城MySQL springcloud vue HTML maven项目设计源码带项目报告
    目录1项目功能2项目介绍3项目地址 1项目功能【java计算机毕设】网上商城MySQLspringcloudvueHTMLmaven项目设计源码带项目报告PPT前后端可分离也可不分离 2项目介绍系统功能:网上商城包括管理员、用户两种角色。管理员功能包括个人中心模块用于修改个人......
  • Java中的API网关:Spring Cloud Gateway与Zuul
    在微服务架构中,API网关扮演着至关重要的角色。它作为系统的入口,负责请求的路由、负载均衡、认证授权、限流熔断等功能。本文将深入探讨两个流行的JavaAPI网关解决方案:SpringCloudGateway和NetflixZuul,并通过详细的解释和代码示例展示它们的使用方法和优缺点。1.API网关概......
  • springcloud断路器作用?
    在SpringCloud中,断路器(CircuitBreaker)是一个用于处理微服务架构中服务调用失败的模式,它可以提高系统的稳定性和容错能力。断路器模式的核心思想是防止在某个服务出现故障时,故障会传递到整个系统,从而避免大规模的服务崩溃。断路器的工作原理断路器模式模拟了电路断路器......