gateWay 结合 nacos 完成 jwt验证

1. 安装nacos 2.1.2

下载ubuntu版的nocos,传到服务器,并解决。

  1.1首先安装jdk:  apt-get install openjdk-8-jdk

  1.2 进行bin目录启动nacos:  bash startup.sh -m standalone

  1.3 根据输出日志 找到启动路径

 

2.开发gateWay

2.1 配置pom.xml

<dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!--                        <version>2021.1</version>-->
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <!--                        <version>2021.1</version>-->
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.18.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter
          不引入spring-boot-starter-jdbc 会报错-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>

        <!--fegin组件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- Feign Client for loadBalancing -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
    </dependencies>

 这个版本nacos 一定要需要fegin组件,虽然用不到,不然做gateway路由的时候,会提示503,死活转发到后面的服务(uri使用lb://iotServer,如果使用真实地址是没有问题)。

server:
  port: 8888 #网关地址
spring:
  profiles:
    active: dev
  application:
    name: gateway #服务名称
  cloud:
    nacos:
      server-addr:  192.168.56.101:8848
    gateway:
      routes:
        - id: iotServer
#          uri: http://127.0.0.1:8099/
          uri: lb://iotServer #路由目的地址
          predicates:
            - Path=/kaying/v1/huabang/**  #遇到这样的url进行拦截与转发

jwt代码

//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter , Ordered {

    @Autowired
    AuthorizeDao dao;
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String requestUrl = exchange.getRequest().getURI().getPath();/*获取请求地址 财哥 2022/10/31 8:15*/
        System.out.println("开始拦截");
        System.out.println(requestUrl);
        MultiValueMap<String,String> params = exchange.getRequest().getQueryParams();/*获取参数列表 财哥 2022/10/31 8:20*/

        String loginUrl = "/kaying/v1/huabang/login";
        if(loginUrl.equals(requestUrl)){/*进行身份验证 财哥 2022/10/31 8:17*/
                if(!params.containsKey("userCode")){
                    JSONObject json = new JSONObject();
                    json.put("desc","用户名不能为空");
                    json.put("code","401");
                    return returnJsonResult(exchange,json.toJSONString());
                }
                String userCode = params.getFirst("userCode");
                String password = params.getFirst("password");
                //查数据库进行匹配
                Map<String, Object> userMap = dao.queryForMap(String.format("select * from hb_user where user_code='%s' and user_pwd='%s' and is_job='1'",userCode,password));
                if(userMap != null){
                    User user = new User();
//                    user.setUserName(userMap.get("user_name").toString());
                    user.setUserCode(userMap.get("user_code").toString());
                    user.setUserPwd(userMap.get("user_pwd").toString());
                    String token = JwtUtils.getToken(user);/*获取token 财哥 2022/10/31 13:04*/
                    exchange.getResponse().setStatusCode(HttpStatus.OK);
                    exchange.getResponse().getHeaders().set("Authorization",token);
                }else{
                    JSONObject json = new JSONObject();
                    json.put("desc","用户名或密码错误");
                    json.put("code","401");
                    exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                    return returnJsonResult(exchange,json.toJSONString());
                }
            return exchange.getResponse().setComplete();
        }else{
            if(!exchange.getRequest().getHeaders().containsKey("Authorization")){
                JSONObject json = new JSONObject();
                json.put("desc","无token值");
                json.put("code","401");
                return returnJsonResult(exchange,json.toJSONString());
            }
            String token = exchange.getRequest().getHeaders().getFirst("Authorization");
            System.out.println("token="+token);
            if (null == token || "".equals(token.trim())) {
                JSONObject json = new JSONObject();
                json.put("desc","未登录");
                json.put("code","401");
                return returnJsonResult(exchange,json.toJSONString());
            }
            System.out.println("token1");
            try{
                System.out.println("token2");
                JwtUtils.checkToken(token);/* 可以正常解析token就放行 财哥 2022/10/31 15:25*/
                System.out.println("token3");
                return  chain.filter(exchange);/* 放行 财哥 2022/10/31 15:25*/
            }catch (Exception ex){
                System.out.println("token4");
                JSONObject json = new JSONObject();
                json.put("desc","token验证失败");
                json.put("code","401");
                return returnJsonResult(exchange,json.toJSONString());
            }
        }
    }

    /**
     * 拦截并返回自定义的json字符串
     */
    private Mono<Void> returnJsonResult(ServerWebExchange exchange, String msg) {
        ServerHttpResponse response = exchange.getResponse();
//        response.setStatusCode(HttpStatus.OK);
        //这里在返回头添加编码,否则中文会乱码
        response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
        byte[] bytes = JSON.toJSONBytes(msg, SerializerFeature.WriteMapNullValue);
        DataBuffer buffer = response.bufferFactory().wrap(bytes);
        return response.writeWith(Mono.just(buffer));
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值