当前位置:

gateWay 结合 nacos 完成 jwt验证

访客 2024-04-23 1333 0

1.安装nacos2.1.2

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

1.1首先安装jdk:apt-getinstallopenjdk-8-jdk

1.2进行bin目录启动nacos:bashstartup.sh-mstandalone

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>
  • <!--FeignClientforloadBalancing-->
  • <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
  • publicclassAuthorizeFilterimplementsGlobalFilter,Ordered{
  • @Autowired
  • AuthorizeDaodao;
  • @Override
  • publicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){
  • StringrequestUrl=exchange.getRequest().getURI().getPath();/*获取请求地址财哥2022/10/318:15*/
  • System.out.println("开始拦截");
  • System.out.println(requestUrl);
  • MultiValueMap<String,String>params=exchange.getRequest().getQueryParams();/*获取参数列表财哥2022/10/318:20*/
  • StringloginUrl="/kaying/v1/huabang/login";
  • if(loginUrl.equals(requestUrl)){/*进行身份验证财哥2022/10/318:17*/
  • if(!params.containsKey("userCode")){
  • JSONObjectjson=newJSONObject();
  • json.put("desc","用户名不能为空");
  • json.put("code","401");
  • returnreturnJsonResult(exchange,json.toJSONString());
  • }
  • StringuserCode=params.getFirst("userCode");
  • Stringpassword=params.getFirst("password");
  • //查数据库进行匹配
  • Map<String,Object>userMap=dao.queryForMap(String.format("select*fromhb_userwhereuser_code='%s'anduser_pwd='%s'andis_job='1'",userCode,password));
  • if(userMap!=null){
  • Useruser=newUser();
  • //user.setUserName(userMap.get("user_name").toString());
  • user.setUserCode(userMap.get("user_code").toString());
  • user.setUserPwd(userMap.get("user_pwd").toString());
  • Stringtoken=JwtUtils.getToken(user);/*获取token财哥2022/10/3113:04*/
  • exchange.getResponse().setStatusCode(HttpStatus.OK);
  • exchange.getResponse().getHeaders().set("Authorization",token);
  • }else{
  • JSONObjectjson=newJSONObject();
  • json.put("desc","用户名或密码错误");
  • json.put("code","401");
  • exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
  • returnreturnJsonResult(exchange,json.toJSONString());
  • }
  • returnexchange.getResponse().setComplete();
  • }else{
  • if(!exchange.getRequest().getHeaders().containsKey("Authorization")){
  • JSONObjectjson=newJSONObject();
  • json.put("desc","无token值");
  • json.put("code","401");
  • returnreturnJsonResult(exchange,json.toJSONString());
  • }
  • Stringtoken=exchange.getRequest().getHeaders().getFirst("Authorization");
  • System.out.println("token="token);
  • if(null==token||"".equals(token.trim())){
  • JSONObjectjson=newJSONObject();
  • json.put("desc","未登录");
  • json.put("code","401");
  • returnreturnJsonResult(exchange,json.toJSONString());
  • }
  • System.out.println("token1");
  • try{
  • System.out.println("token2");
  • JwtUtils.checkToken(token);/*可以正常解析token就放行财哥2022/10/3115:25*/
  • System.out.println("token3");
  • returnchain.filter(exchange);/*放行财哥2022/10/3115:25*/
  • }catch(Exceptionex){
  • System.out.println("token4");
  • JSONObjectjson=newJSONObject();
  • json.put("desc","token验证失败");
  • json.put("code","401");
  • returnreturnJsonResult(exchange,json.toJSONString());
  • }
  • }
  • }
  • /**
  • *拦截并返回自定义的json字符串
  • */
  • privateMono<Void>returnJsonResult(ServerWebExchangeexchange,Stringmsg){
  • ServerHttpResponseresponse=exchange.getResponse();
  • //response.setStatusCode(HttpStatus.OK);
  • //这里在返回头添加编码,否则中文会乱码
  • response.getHeaders().add("Content-Type","application/json;charset=UTF-8");
  • byte[]bytes=JSON.toJSONBytes(msg,SerializerFeature.WriteMapNullValue);
  • DataBufferbuffer=response.bufferFactory().wrap(bytes);
  • returnresponse.writeWith(Mono.just(buffer));
  • }
  • @Override
  • publicintgetOrder(){
  • return-1;
  • }
  • }
  • 发表评论

    • 评论列表
    还没有人评论,快来抢沙发吧~