springCloud gateway+jwt方式做token校验

SpringCloudGateway+JWT统一认证鉴权 参考springcloud-learning/micro-oauth2 阅读详情

项目中需要做接口的token校验,项目大致分为以下几个模块:
eureka:eureka的注册中心
eureka-server:服务提供者
api:服务消费者,使用fegin消费服务
gateway:网关,用于进行token校验

1. eureka注册中心

配置了一个服务中心,并无具体的代码操作
pom文件中引入eureka的依赖,在启动类中加入@EnableEurekaServer

     <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>

配置文件内容:

server:
  port: 8083
spring:
  application:
    name: register-center
eureka:
  instance:
    #注册中心的ip地址
    hostname: 127.0.0.1
  client:
    register-with-eureka: false
    fetch-registry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
2. eureka-server
 提供服务,返回数据均为json串,使用restful方式的接口,接口中使用RequestMapping代替GetMapping和PostMapping
3. 服务的消费端api

这里需要用到redis及md5加密,引入jar包

 <!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version> 2.6.1</version>
</dependency>
<dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-crypto</artifactId>
      <version>5.0.0</version>
</dependency>
<!--  jwt鉴权  -->
<dependency>
     <groupId>com.auth0</groupId>
     <artifactId>java-jwt</artifactId>
     <version>3.4.1</version>
</dependency> 
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>        

登录的controller:

@RestController
@RequestMapping("/route-api")
public class LoginController {

    @Autowired
    private MemberService memberService;

    private ResponseDto responseDto;

    @Autowired
    private TokenUtil tokenUtil;

    /**
     * 登录方法
     * @param phone
     * @param password
     * @return
     */
    @GetMapping(value = "/login")
    public String login(@RequestParam("phone") String phone, @RequestParam("password") String password){
        //账号密码校验
        if(StrUtil.isNotEmpty(phone) && StrUtil.isNotEmpty(password)){
            String result = memberService.login(phone,password);
            if (result != null ){
                String object = (String)JSON.parse(result);
                DataResponseDto responseData = JSON.parseObject(object,DataResponseDto.class);
                if (responseData.getCode().equals(StatusCodeConstants.SUCCESS)){
                   Map<String, String> map = tokenUtil.getToken(phone, "1");
                    //返回结果
                    responseDto = new ResponseDto(StatusCodeConstants.SUCCESS,"成功并返回数据", map.get("token"), map.get("refreshToken"),responseData.getData());
                }else {
                    responseDto = new ResponseDto(responseData.getCode(),responseData.getMessage(),null);
                }
            }else {
                responseDto = new ResponseDto(StatusCodeConstants.PHONE_OR_PASSWORD_ERROR,"手机号或密码错误",null);
            }
        }else {
            responseDto = new ResponseDto(StatusCodeConstants.PHONE_OR_PASSWORD_ERROR,"手机号或密码错误",null);
        }
        return JSON.toJSONString(responseDto);
    }

    /**
     * 刷新JWT
     * @param refreshToken
     * @return
     */
    @GetMapping("/refresh")
    public String refreshToken(@RequestParam("refreshToken") String refreshToken, @RequestParam("phone") String phone){
        responseDto = tokenUtil.refreshToken(phone, "1", refreshToken);
        return JSON.toJSONString(responseDto);
    }

    /**
     * 退出时删除key
     * @param phone
     * @return
     */
    @GetMapping("/logout")
    public String logout( @RequestParam("phone") String phone){
        tokenUtil.removeToken(phone, "1");
        responseDto = new ResponseDto(StatusCodeConstants.SUCCESS, "退出成功",null);
        return JSON.toJSONString(responseDto);
    }
}

TokenUtil代码:

@Component
@PropertySource(value = "classpath:jwt.properties")
public class TokenUtil {

    @Value("${token.expire.time}")
    private long tokenExpireTime;

    @Value("${refresh.token.expire.time}")
    private long refreshTokenExpireTime;

    private Map<String , String> map = new HashMap<>(2);

    /**
     * 固定的头
     */
    private static final String OPERATE = "OPERATE";
    private static final String USER = "USER";
    private static final String WX = "WX";

    private ResponseDto responseDto;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 生成token和refreshToken
     * @param phone
     * @param type
     * @return
     */
    public Map<String, String> getToken(String phone, String type){
        //生成refreshToken
        String refreshToken = UUID.randomUUID().toString().replaceAll("-","");
        String prefix = this.getPrefix(type);
        String token = this.buildJWT(phone, prefix);
        String key = SecureUtil.md5(prefix + phone);
        //向hash中放入数值
        stringRedisTemplate.opsForHash().put(key,"token", token);
        stringRedisTemplate.opsForHash().put(key,"refreshToken", refreshToken);
        //设置key过期时间
        stringRedisTemplate.expire(key,
                refreshTokenExpireTime, TimeUnit.MILLISECONDS);
        map.put("token", token);
        map.put("refreshToken", refreshToken);
        return map;
    }

    /**
     * 刷新token
     * @param phone
     * @param type
     * @param refreshToken
     * @return
     */
    public ResponseDto refreshToken(String phone, String type, String refreshToken){
        String prefix = this.getPrefix(type);
        String key = SecureUtil.md5(prefix + phone);
        String oldRefresh = (String) stringRedisTemplate.opsForHash().get(key, "refreshToken");
        if (StrUtil.isBlank(oldRefresh)){
            responseDto = new ResponseDto(StatusCodeConstants.REFRESH_TOKEN_TIME_OUT,"refreshToken过期",null);
        }else {
            if (!oldRefresh.equals(refreshToken)){
                responseDto = new ResponseDto(StatusCodeConstants.REFRESH_TOKEN_ERROR,"refreshToken错误",null);
                System.out.println("refreshToken错误");
            }else {
                String token = this.buildJWT(phone, prefix);
                stringRedisTemplate.opsForHash().put(key,"token", token);
                stringRedisTemplate.opsForHash().put(key,"refreshToken", refreshToken);
                stringRedisTemplate.expire(key,
                        refreshTokenExpireTime, TimeUnit.MILLISECONDS);
                responseDto = new ResponseDto(StatusCodeConstants.SUCCESS,"成功并返回数据", token, refreshToken);
            }
        }
        return responseDto;
    }

    /**
     * 删除key
     * @param phone
     * @param type
     */
    public boolean removeToken(String phone, String type){
        String prefix = this.getPrefix(type);
        String key = SecureUtil.md5(prefix + phone);
        return stringRedisTemplate.delete(key);
    }

    /**
     * 获取前缀
     * @param type 1 操作端  2  用户端 3 小程序
     * @return
     */
    private String getPrefix(String type){
        String prefix = null;
        if ("1".equals(type)){
            prefix =OPERATE;
        }else if ("2".equals(type)){
            prefix = USER;
        }else if ("3".equals(type)){
            prefix =WX;
        }
        return prefix;
    }

    /**
     * 生成jwt
     * @param phone 手机号
     * @param prefix 前缀
     * @return
     */
    private String buildJWT(String phone, String prefix){
        //生成jwt
        Date now = new Date();
        Algorithm algo = Algorithm.HMAC256(prefix);
        String token = JWT.create()
                //签发人
                .withIssuer("userPhone")
                //签发时间
                .withIssuedAt(now)
                //过期时间
                .withExpiresAt(new Date(now.getTime() + tokenExpireTime))
                //自定义的存放的数据
                .withClaim("phone", phone)
                //签名
                .sign(algo);
        return token;
    }
}

因为我这里是需要给操作端、用户端、小程序提供接口,所以用type定义不同的头以区分key,也可以选择使用不同的datebase。

ResponseDto 是自定义的返回参数类:

@Setter
@Getter
public class ResponseDto<T>{

    /**
     * 状态码
     */
    private Integer code;

    /**
     * 状态信息
     */
    private String message;

    /**
     * 数据
     */
    private T data;

    /**
     * token
     */
    private String token;

    /**
     * 刷新token
     */
    private String refreshToken;

    public ResponseDto(){
    }

    public ResponseDto(Integer code, String message, T data){
        this.code = code;
        this.data = data;
        this.message = message;
    }

    public ResponseDto(Integer code, String message, String token,String refreshToken){
        this.code = code;
        this.message = message;
        this.token = token;
        this.refreshToken = refreshToken;
    }

    public ResponseDto(Integer code, String message, String token,String refreshToken,T data){
        this.code = code;
        this.message = message;
        this.token = token;
        this.refreshToken = refreshToken;
        this.data = data;
    }
}

service层主要是在进行调用方法操作:

@FeignClient(name = "service-provider")
public interface MemberService {

    /**
     * 调取登录的方法
     * @param phone
     * @param password
     * @return
     */
    @RequestMapping("/login")
    String login(@RequestParam("phone") String phone, @RequestParam("password") String password);

}

需要在启动类上加@EnableFeignClients和@EnableEurekaClient注解
yaml配置文件:

eureka:
  instance:
    prefer-ip-address: true
    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则),默认30
    lease-renewal-interval-in-seconds: 10
    #Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己),默认90
    lease-expiration-duration-in-seconds: 12
  client:
    registry-fetch-interval-seconds: 10 #eureka client刷新本地缓存时间,默认30
    serviceUrl:
      defaultZone: http://127.0.0.1:8083/eureka/

server:
  port: 8082
spring:
  application:
    name: server-client

  #设置允许 一个项目中有name一样的FeignClient
  main:
    allow-bean-definition-overriding: true
  #redis配置
  redis:
    host: 
    port: 
    password: 
    database: 1
    timeout: 60s
   ## springboot2.0之后将连接池由jedis改为lettuce
    lettuce:
      pool:
        max-idle: 30
        max-active: 8
        max-wait: 10000
        min-idle: 10

jwt.properties中的配置:

#token过期时间:30分钟
token.expire.time=1800000

#refreshToken过期时间:12小时
refresh.token.expire.time=43200000

四.gateway中转发和过滤接口

这里在引入时候,需要注意:Spring Cloud Gateway 不使用 Web 作为服务器,而是 使用 WebFlux 作为服务器,Gateway 项目已经依赖了 starter-webflux,所以这里 千万不要依赖 starter-web

 <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-gateway</artifactId>
   </dependency>

   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
   </dependency>

   <dependency>
       <groupId>com.auth0</groupId>
       <artifactId>java-jwt</artifactId>
       <version>3.4.1</version>
   </dependency>

   <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
   </dependency>

   <dependency>
       <groupId>cn.hutool</groupId>
       <artifactId>hutool-core</artifactId>
       <version>4.5.2</version>
   </dependency>

   <!-- 使用阿里的fastjson解析json数据 -->
   <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>fastjson</artifactId>
       <version>1.2.57</version>
   </dependency>

全局过滤器代码,其中StatusCodeConstants定义了一些常量:

@Component
@PropertySource(value = "classpath:jwt.properties")
public class ApiGlobalFilter implements GlobalFilter, Ordered {

    /**
     * 不进行token校验的请求地址
     */
    @Value("#{'${jwt.ignoreUrlList}'.split(',')}")
    public List<String> ignoreUrl;

    /**
     * 拦截所有的请求头
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String requestUrl = exchange.getRequest().getPath().toString();
        boolean status = CollectionUtil.contains(ignoreUrl, requestUrl);
        if (!status){
            String token = exchange.getRequest().getHeaders().getFirst("token");
            //type用于区分不同的端,在做校验token时需要
            String type= exchange.getRequest().getHeaders().getFirst("type");
            ServerHttpResponse response = exchange.getResponse();
            //没有数据
            if (StrUtil.isBlank(token) || StrUtil.isBlank(type)) {
                JSONObject message = new JSONObject();
                message.put("code", StatusCodeConstants.TOKEN_NONE);
                message.put("message", "鉴权失败,无token或类型");
                byte[] bits = message.toString().getBytes(StandardCharsets.UTF_8);
                DataBuffer buffer = response.bufferFactory().wrap(bits);
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                response.getHeaders().add("Content-Type", "text/json;charset=UTF-8");
                return response.writeWith(Mono.just(buffer));
                //有数据
            }else {
            	String prefix = this.getPrefix(type);
                //校验token
                String userPhone = verifyJWT(token ,prefix);
                if (StrUtil.isEmpty(userPhone)){
                    JSONObject message = new JSONObject();
                    message.put("message", "token错误");
                    message.put("code", StatusCodeConstants.TOKEN_ERROR);
                    byte[] bits = message.toString().getBytes(StandardCharsets.UTF_8);
                    DataBuffer buffer = response.bufferFactory().wrap(bits);
                    response.setStatusCode(HttpStatus.UNAUTHORIZED);
                    response.getHeaders().add("Content-Type", "text/json;charset=UTF-8");
                    return response.writeWith(Mono.just(buffer));
                }
                //将现在的request,添加当前身份
                ServerHttpRequest mutableReq = exchange.getRequest().mutate().header("Authorization-UserName", userPhone).build();
                ServerWebExchange mutableExchange = exchange.mutate().request(mutableReq).build();
                return chain.filter(mutableExchange);
            }
        }
        return chain.filter(exchange);
    }

    /**
     * JWT验证
     * @param token
     * @return userPhone
     */
    private String verifyJWT(String token, String prefix){
        String userPhone;
        try {
            Algorithm algorithm = Algorithm.HMAC256(prefix);
           JWTVerifier verifier = JWT.require(algorithm)
                    .withIssuer("userPhone")
                    .build();
            DecodedJWT jwt = verifier.verify(token);
            userPhone = jwt.getClaim("phone").asString();
        } catch (JWTVerificationException e){
        	e.printStackTrace();
            return "";
        }
        return userPhone;
    }
    
	/**
     * 根据type获取前缀
     * @param type
     * @return
     */
    private String getPrefix(String type){
        String prefix = null;
        if ("1".equals(type)){
            prefix = "OPERATE";
        }else if ("2".equals(type)){
            prefix = "USER";
        }else if ("3".equals(type)){
            prefix = "WX";
        }
        return prefix;
    }

    @Override
    public int getOrder() {
        return -200;
    }
}

jwt.properties中的配置了不拦截的请求:

jwt.ignoreUrlList=/route-api/login,/route-api/refresh

配置文件:

eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8083/eureka/

server:
  port: 8087
spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        #netty 路由过滤器,http或https开头 lb://代表是eureka服务的名称  predicates:表示会过滤掉的请求头
        - id: gateway-route
          uri: lb://server-client
          predicates:
            - Path=/api/**,/route-api/**
    #处理跨域请求问题
    globalcors:
      cors-configurations:
        '[/**]':
          allowedOrigins: "*"
          allowedMethods: "*"
  #redis配置
  redis:
    host: 
    port: 6379
    password: 
    database: 1
    timeout: 60s
 ## springboot2.0之后将连接池由jedis改为lettuce
    lettuce:
      pool:
        max-idle: 30
        max-active: 8
        max-wait: 10000
        min-idle: 10
7000 字 | 32 图 | 手摸手 Spring Cloud Gateway + JWT 实现登录认证 虽然本篇是讲实战内容的,但是里面又涉及了很多原理性内容,比如网关、JWT 的原理。结合实战讲解,相信大家对如何使用 Spring Cloud Gateway + JWT 实现登录认证有了充分的理解。 阅读详情

相关推荐

springcloud:4.2 GateWay结合JWT实现网关鉴权

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

m0_63040701的博客 1818

springcloud gateway集成JWT——实现登录鉴权

springcloud gateway基于jwt token,实现用户登录鉴权功能

tang_seven的博客 1万+

springcloud篇2-feign、gateway

说明:(1)日志级别NONE-没有日志BASIC-记录请求的开始和结束时间HEADERS-记录请求的开始和结束时、请求头和响应头FULL-记录请求的开始和结束时、请求头和响应头、请求体和响应体但该方式不推荐,会导致紧耦合。之前的微服务允许任何的访问,不安全,需要添加一个网关(功能包括身份认证和权限校验、服务路由、负载均衡、请求限流)。

qq_51476492的博客 1537

SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证

1、gateway filter的生命周期Spring Cloud Gateway同zuul类似,有“pre”和“post”两种方式的filter。客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端pre类型的filter:在业务逻辑之前post类型的filter:在业务逻辑之后2、gateway filter的应用场景。...

知道的越多 不知道的就越多 1万+

Spring Cloud微服务接口鉴权(利用JWT生成的TOKEN)

0 JWT是什么 JWT(JSON Web Token)是一种开放标准,它以一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。 其认证原理是,客户端向服务器申请授权,服务器认证以后,生成一个token字符串并返回给客户端,此后客户端在请求受保护的资源时携带这个token,服务端进行验证再从这个token中解析出用户的身份信息。 0.1 JWT的结构 一个JWT是一个字符串,其由H...

c815852517的博客 2552

FPGA赋能:从加权灰度均值到快速收敛的自动曝光实战

本文深入探讨了FPGA在工业视觉自动曝光算法中的应用,重点介绍了加权灰度均值法的优化实现与快速收敛策略。通过硬件友好的算法改造和流水线架构设计,FPGA方案能在1帧内完成曝光调整,显著提升处理速度和能效比,适用于复杂光照条件下的工业检测场景。

weixin_29306317的博客 82

Spring Cloud GateWay实现token的校验和传输

Spring Cloud GateWay实现token的校验和传输 1.1 SpringCloud Gateway 简介 Spring Cloud GateWay基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty. Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。 提前声明:Spring Cloud Gateway 底层使用了高性能的通

xingxinggua9620的博客 8962

长安车机破解后能干啥?分享我的UNI-K车机安装第三方应用与优化体验实录

本文详细记录了长安UNI-K车机破解后的实用玩法与深度优化指南,包括安装第三方应用、导航体验升级、影音系统改造及系统美化等。通过工具箱和升级技巧,车主可以大幅提升用车体验,解锁更多隐藏功能。

weixin_33217202的博客 401

SpringCloud 屏蔽个别用户访问全部接口

网关拿到 token 解析出 userId(你的业务逻辑解析 token),判断是否在黑名单,命中直接返回 403。java@Component@Order(Integer.MIN_VALUE) // 优先级最高,最先执行// 黑名单用户ID,少量用户可以内存存放;生产使用Redis@Override// 1. 从header获取token,根据你的业务解析token得到userId// 【需要你自己实现token解析逻辑】// 2. 判断用户是否黑名单。

weixin_48309090的博客 86

SRE校招面试全攻略:从基础理论到实战场景解析

本文为SRE(站点可靠性工程)校招面试提供全面攻略,涵盖计算机基础、运维核心技能、场景设计与系统架构等关键模块。文章结合真实面试真题,解析了从Linux原理、网络协议到容器化、监控告警等实战考点,并分享了高可用设计、故障排查等工程思维,旨在帮助应届生夯实基础、理清思路,从容应对SRE校招挑战。

bush的博客 643

嵌入式硬件实战:RC、LC与RL滤波电路的设计与选型指南

本文深入探讨了嵌入式系统中RC、LC与RL滤波电路的设计与选型策略。通过生活化比喻和实战案例,详细解析了三种滤波电路的工作原理、应用场景及工程注意事项,帮助工程师根据电流大小、频率特征和成本预算选择最优方案,提升嵌入式硬件设计的稳定性和抗干扰能力。

kiwi8的博客 284

【项目实战】Spring Cloud Gateway 实现JWT / Token登录认证流程

在我看来,在某些场景下,网关就像是一个公共方法,把项目中的都要用到的一些功能提出来,抽象成一个服务。比如,我们可以在业务网关上做日志收集、Token校验等等,当然这么理解很狭隘,因为网关的能力远不止如此,但是不妨碍我们更好地理解它。下面的例子演示了,如何在网关校验Token,并提取用户信息放到Header中传给下游业务系统。 1. 生成Token 用户登录成功以后,生成token,此后的所有请求都带着token。网关负责校验token,并将用户信息放入请求Header,以便下游系统可以方便的获取用户信息

骏马逸动,心随你动的博客 1万+

融合Retinex理论与Transformer的YOLOv8低光照目标检测增强方法【YOLOv8】

图像分解:将输入图像分解为光照成分和反射成分。光照估计:估计光照图以消除暗光区域。图像重建:将光照增强后的反射图像重建成最终图像。Retinexformer通过在Transformer中引入Retinex的图像增强思路,使得低光照图像的细节能够得到充分保留。本文提出了一种基于Retinexformer的低光照增强方法,用于改进YOLOv8模型在夜间和低光照环境下的目标检测性能。

博客 1929

SpringCloud gateway+Spring Security + JWT实现登录和用户权限校验

使用SpringCloud gateway与Spring Security以及JWT,在前后端分离情况下的用户统一认证授权

yuan__once的博客 1万+

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

ChenJin_2的博客 272

STM32 HAL PWM (占空比) -电机软启动不到位解决

为了避免电机启动电压大造成设备损坏,或者供电不足导致重启,通常在对启动都需要一个PWM进行软启动,下面对PWM电机软启动详细介绍。

weixin_44597885的博客 866

spring Cloud Gateway + JWT 实现统一的认证授权

Spring Cloud Gateway + shiro + JWT 实现统一的认证授权 一、项目添加 Spring Cloud Gateway 依赖 参考:创建spring Cloud Gateway 二、添加shiro 1、加入shiro依赖 <dependency> <groupId>org.apache.shiro</groupId> <art...

github_35976996的博客 7万+

19、CATIA V5:参数化建模与零件目录创建全解析

本文详细解析了在CATIA V5中通过设计表实现参数化建模及零件目录创建的完整流程。以支撑块和钩形夹为例,介绍了参数识别、设计表创建与关联、配置管理以及零件目录的构建方法。同时,提供了实际操作建议和注意事项,帮助设计师高效创建和管理零件族,提升设计效率和质量。

raspberrypi5的博客 446

gateway做token校验

token一般放在请求头中 key=Authorization, value=bearer token。token会返回给浏览器(存储),当访问的时候,携带token 发起请求。本文使用springcloud的gateway做token校验。登录的本质:拿用户名和密码 换 token。(前缀:bearer+空格+token)token校验过滤器。前提: 和前端约定好。

风也温柔☆的博客 2346

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

springcloud+gateway 全局过滤器校验jwt token

1.编写token jwt工具类 package com.baidu.admin.utils; import io.jsonwebtoken.*; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.util.*; public class AppJwtUtil { // TOKEN的有效期一天(S) private static final int TOKEN_TIME

weixin_45538722的博客 3441

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

spring cloud gateway权限校验

spring cloud gateway权限校验可以整合security实现,我这里采用自定义filter简单实现,步骤如下: 1.首先配置RouteLocator,贴代码 @Configuration public class GatewayRoutes { @Autowired private TokenGatewayFilter tokenGatewayFilter; @B...

5354

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring Cloud Gateway+Spring Security OAuth2+JWT(二)

Spring Cloud Gateway+Spring Security OAuth2+JWT(二)前言Gateway校验token服务获取token效果 前言 上一篇搭建了授权服务,这篇我们来讲讲网关。 Gateway校验token 我们的目标是校验token并将其解密之后传给服务 package com.ljl.filter; import com.alibaba.fastjson.JSONO...

a294634473的博客 3万+

【SpringCloud Gateway】SpringCloud各微服务之间用户登录信息共享的实现思路——gateway网关token校验以及向微服务发送请求携带token

SpringCloud各微服务之间用户登录信息共享的实现思路。 gateway网关token校验以及向微服务发送请求携带token。

zxy2361380031的博客 5160

springcloud2 gateway 之三:使用filter做权限验证

springcloud2 gateway 之一:简单样例https://blog.youkuaiyun.com/haveqing/article/details/88424598 springcloud2 gateway 之二:转发调用eureka客户端服务https://blog.youkuaiyun.com/haveqing/article/details/88427571 文件结构 一、GatewayCo...

2万+

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

说说背景:假如有一个用户服在用户登录后,生成一个token给到客户端,用户每次请求时都需要这个token,于是每次都会在网关 gateway 校验,校验通过后网关从token中解析出userId,然后将userId送到各个服务。 比如现在有一个 java 服务 和 一个 php 服务,从网关访问的URL 分别是http://127.0.0.1:8201/java/ 和http://...

1023

spring cloud gateway 路由转发 token校验

微服务的时代背景下,多个服务之间协同合作已经成为常态,一个高可用的项目应该将细粒度化业务,多节点部署。网关转发即多个服务的门户,暴露一个接口对外,安全性高,只需要在网关层做校验,其余的服务依赖网关转发,代码不冗余,可读性强。 pom依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-

1884
上一篇: springboot项目集成springcloud-eureka-server时与shiro中的ehcache冲突问题解决
下一篇: windows中查看端口占用情况并关闭对应进程
蓝色格子
博客等级 码龄9年 129粉丝 174原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值