怎么使用Spring Cloud的Zuul网关和JWT身份验证

本篇内容主要讲解“怎么使用Spring Cloud的Zuul网关和JWT身份验证”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Spring Cloud的Zuul网关和JWT身份验证”吧!

 1.1什么是Zuul

  • Zuul,是spring cloud 全家桶中的网关

  • 网关:程序统一入口。主要功能:服务分发(动态路由),服务鉴权 等。

怎么使用Spring Cloud的Zuul网关和JWT身份验证

1.2 快速入门--路由转发

  • 需求

//已有访问路径
http://localhost:8080/user
//通过网关希望访问路径
http://localhost:10010/userservice/user
  • 步骤0:创建 zuul_demo

  • 步骤一:修改pom文件,添加 zuul 、测试 依赖

  • 步骤二:创建启动类,添加 开启网关代理 注解 @EnableZuulProxy

  • 步骤三:创建yml文件,配置端口、服务名、对应关系(访问路径 / 服务地址)

  • 步骤0:创建 zuul_demo

  • 步骤一:修改pom文件,添加 zuul 、测试 依赖

    <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
        </dependencies>

     

  • 步骤二:创建启动类,添加 开启网关代理 注解 @EnableZuulProxy

    package com.czxy;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
    
    
    @SpringBootApplication
    @EnableZuulProxy        //开启网关代理
    public class Zuul2Application {
        public static void main(String[] args) {
            SpringApplication.run(Zuul2Application.class,args);
        }
    }

     

  • 步骤三:创建yml文件,配置端口、服务名、对应关系(访问路径 / 服务地址)

    server:
      port: 10010
    spring:
      application:
        name: zuuldemo2
    #网关配置:访问路径 和 服务路径 对应关系
    zuul:
      routes:
        userservice:
          path: /userservice/**       #访问路径
          url: http://localhost:8080  #服务路径

     

1.3面向服务的路由

怎么使用Spring Cloud的Zuul网关和JWT身份验证

  • 步骤一:搭建eureka客户端(pom依赖、启动类注解、yml注册地址)

    • pom依赖

      <!--添加eureka客户端-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
              </dependency>

       

    • 启动类

      package com.czxy;
      
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
      import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
      
      
      @SpringBootApplication
      @EnableZuulProxy        //开启网关代理
      @EnableEurekaClient     //开启eureka客服端
      public class Zuul2Application {
          public static void main(String[] args) {
              SpringApplication.run(Zuul2Application.class,args);
          }
      }

       

    • yml文件

      #注册地址
      eureka:
        client:
          service-url:
            defaultZone: http://localhost:10086/eureka


  • 步骤二:yml文件对应关系 (访问路径 和 服务名)

    #网关配置:访问路径 和 服务路径 对应关系
    zuul:
      routes:
        userservice:
          path: /userservice/**       #访问路径
          #url: http://localhost:8080 #服务路径
          serviceId: userservice    #服务名称时

1.4 简化路由配置

  • 路由名称 和 服务名 通常采用一样的命名,zuul允许简化

zuul:
  routes:
    userservice: /userservice/**

1.5 默认路由规则

  • 默认情况下,一切服务的映射路径就是服务名本身。

##默认配置
zuul:
  routes:
    adminservice: /adminservice/**

怎么使用Spring Cloud的Zuul网关和JWT身份验证

1.6 zuul基础环境搭建

  • 步骤0:创建项目 zuul_demo

  • 步骤一:修改pom文件,添加 zuul依赖、eureka 客户端依赖

       <dependencies>
            <!--网关依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            </dependency>
            <!--添加eureka客户端-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <!--测试-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
    
        </dependencies>


  • 步骤二:创建启动类,添加2添加 开启网关代理、开启eureka客户端

    • 开启网关代理 @EnableZuulProxy

    • 开启eureka客户端 @EnableEurekaClient

      package com.czxy;
      
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
      import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
      
      
      @SpringBootApplication
      @EnableZuulProxy        //开启网关代理
      @EnableEurekaClient     //开启eureka客服端
      public class Zuul2Application {
          public static void main(String[] args) {
              SpringApplication.run(Zuul2Application.class,args);
          }
      }


  • 步骤三:创建yml文件,配置端口号、服务名、注册地址

    server:
      port: 10010
    spring:
      application:
        name: zuuldemo2
    #注册地址
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:10086/eureka

1.7 路由前缀

  • 路由前缀:用于维护 版本号 或 项目名

  • 修改yml文件,进行配置

zuul:
  prefix: /api
  • 访问

怎么使用Spring Cloud的Zuul网关和JWT身份验证

1.8 Zuul过滤器

1.8.1 概述

  • 编写过滤器,继承父类:ZuulFilter

  • 常见方法:

    • filterType() 过滤器类型,取值:"pre"

    • filterOrder() 过滤器顺序,取值:1

    • shouldFilter() 是否执行,取值:true

    • run() 执行业务逻辑

1.8.2 自定义过滤器

  • 只要将过滤器的实现,添加到spring容器中,zuul将自动启用过滤器。

    • 过滤器父类:ZuulFilter

    • 工具类(请求上下文对象):RequestContext

    • 特殊请求头:Authorization(下图是postman软件)

      怎么使用Spring Cloud的Zuul网关和JWT身份验证

package com.czxy.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;


@Component
public class LoginFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";            //1 过滤器类型
    }

    @Override
    public int filterOrder() {
        return 1;               //2 过滤器排序
    }

    @Override
    public boolean shouldFilter() {
        return true;           //3 是否执行
    }

    @Override
    public Object run() throws ZuulException {
        // 获得一个特殊请求头,判断是否有值:有 返回 null(放行) , 没有 响应状态码401
        //1 获得工具类(请求上下文对象)
        RequestContext requestContext = RequestContext.getCurrentContext();
        //2 通过工具类获得request对象
        HttpServletRequest request = requestContext.getRequest();
        //3 通过request对象获得特殊请求头
        String auth = request.getHeader("authorization");
        //4 判断
        if(auth == null){
            //没有
            requestContext.setSendZuulResponse(false);      //关闭响应
            requestContext.setResponseStatusCode(401);
        }

        //放行
        return null;
    }
}

1.9 Spring Cloud 总结

  • eureka :注册中心

    • 服务端:提供注册

    • 客户端:进行注册

  • ribbon:负载均衡(集群)

  • Hystrix:熔断器,执行备选方案

  • Feign:远程调用

  • Zuul:网关,统一入口。

怎么使用Spring Cloud的Zuul网关和JWT身份验证

2. JWT

服务与服务之间共享数据,采用JWT先生成数据,在另一个服务中解析数据,为了保证数据安全性,使用RAS对数据进行加密。

2.1 RAS 工具

  • RAS 非对称加密算法

    • 同时生产一对秘钥:公钥和私钥。

    • 公钥秘钥:用于加密

    • 私钥秘钥:用于解密

    • 特点

  • 编写测试类使用工具生成公钥,私钥

//生成公钥和私钥
RasUtils.generateKey(公钥位置,私钥位置,密码);
RasUtils.generateKey(pubKeyPath,priKeyPath,"234");
//获得公钥
RasUtils.getPublicKey(pubKeyPath);
//获得私钥
RasUtils.getPrivateKey(priKeyPath);

怎么使用Spring Cloud的Zuul网关和JWT身份验证

2.2 JWT工具

  • JWT 基于JSON的认证规范。(Json Web Token)

  • 使用JWT目的:生成数据、解析数据

  • 使用JWT

    • 步骤一:添加依赖(含之前的)

      <properties>
              <jwt.jjwt.version>0.9.0</jwt.jjwt.version>
              <jwt.joda.version>2.9.7</jwt.joda.version>
              <lombok.version>1.16.20</lombok.version>
              <beanutils.version>1.9.3</beanutils.version>
          </properties>
      
      
          <dependencies>
              <!--网关依赖-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
              </dependency>
              <!--添加eureka客户端-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
              </dependency>
              <!--测试-->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
              </dependency>
              <!--jwt依赖-->
              <dependency>
                  <groupId>commons-beanutils</groupId>
                  <artifactId>commons-beanutils</artifactId>
                  <version>${beanutils.version}</version>
              </dependency>
      
              <dependency>
                  <groupId>io.jsonwebtoken</groupId>
                  <artifactId>jjwt</artifactId>
                  <version>${jwt.jjwt.version}</version>
              </dependency>
      
              <dependency>
                  <groupId>joda-time</groupId>
                  <artifactId>joda-time</artifactId>
                  <version>${jwt.joda.version}</version>
              </dependency>
      
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
                  <version>${lombok.version}</version>
                  <scope>provided</scope>
              </dependency>
      
      
          </dependencies>
    • 步骤二:导入工具

    • 步骤三:使用

      //生成数据, UserInfo --> String(加密)
      //JwtUtils.generateToken(数据,过期时间(分钟), 私钥)
      String token = JwtUtils.generateToken(userInfo,30, RasUtils.getPrivateKey(priKeyPath));
      
      //解析数据, String(加密) --> UserInfo
      // JwtUtils.getObjectFromToken(加密数据, 公钥, 封装对象.class);
      UserInfo userInfo = JwtUtils.getObjectFromToken(token, RasUtils.getPublicKey(pubKeyPath), UserInfo.class);

到此,相信大家对“怎么使用Spring Cloud的Zuul网关和JWT身份验证”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!