精选文章 使用spring cloud alibaba-网关(gateway)+安全认证(springsecurity+jwt)

使用spring cloud alibaba-网关(gateway)+安全认证(springsecurity+jwt)

作者:疯子也是猖狂 时间: 2021-02-05 09:43:16
疯子也是猖狂 2021-02-05 09:43:16
【摘要】上一篇博客开头说到了gateway服务之前调用有些特殊,那是因为webflux和spring-webmvc; 
gateway不兼容spring-webmvc所以项目创建的时候也就剔除了,剔除之后无法使用HttpServletRequest,所以之前搭建的不能简单的替换zuul,改动太大。只能将zuul从安全认证这个模块中移除,然后独立成一个模块供gateway认证时调用。 
改造之前的sp...

上一篇博客开头说到了gateway服务之前调用有些特殊,那是因为webflux和spring-webmvc;

gateway不兼容spring-webmvc所以项目创建的时候也就剔除了,剔除之后无法使用HttpServletRequest,所以之前搭建的不能简单的替换zuul,改动太大。只能将zuul从安全认证这个模块中移除,然后独立成一个模块供gateway认证时调用。

改造之前的springsecurity,移除zuul相关依赖,在UserController中新增一个接口

/** * 认证 * @param token * @return */ @RequestMapping(value = "/verificationToken",method = {RequestMethod.POST,RequestMethod.GET}) @ResponseBody public ResultVO verificationToken(@RequestParam("token") String token){ AuthUser authUser = JwtUtil.parseToken(token); authUser.getUsername(); return Backtrack.success(true); }

此方法供gateway调用,Backtrack为一个统一返回和接收校验的类,用于抛请求异常。

package com.cloudalibaba.securitypermission.common.methods;

import com.cloudalibaba.securitypermission.common.vo.ResultVO;

/**
 * 返回和接收校验
 * @author wqy
 * @version 1.0
 * @date 2020/6/9 15:52
 */
public class Backtrack{ /** * 成功的执行 * @param t 数据体 * @param msg 备注 * @param  泛型 * @return */ public static  ResultVO success(T t, String msg){ ResultVO resultVO = new ResultVO<>(); resultVO.setCode(10); resultVO.setData(t); resultVO.setMsg(msg); return resultVO; } /** * 成功的执行 * @param t 数据体 * @param  泛型 * @return */ public static  ResultVO success(T t){ ResultVO resultVO = new ResultVO<>(); resultVO.setCode(10); resultVO.setData(t); return resultVO; } /** * 成功的执行 * @param msg 备注 * @param  泛型 * @return */ public static  ResultVO success(String msg){ ResultVO resultVO = new ResultVO<>(); resultVO.setCode(10); resultVO.setMsg(msg); return resultVO; } /** * 失败的执行 * @param t 数据体 * @param msg 备注 * @param  泛型 * @return */ public static  ResultVO errot(T t,String msg){ ResultVO resultVO = new ResultVO<>(); resultVO.setCode(11); resultVO.setData(t); resultVO.setMsg(msg); return resultVO; } /** * 失败的执行 * @param msg 备注 * @param  泛型 * @return */ public static  ResultVO errot(String msg){ ResultVO resultVO = new ResultVO<>(); resultVO.setCode(11); resultVO.setMsg(msg); return resultVO; } /** * 校验ResultVO结果 * 如果code==10则成功其余则失败 * @param resultVO * @return */ public static  T checkData(ResultVO resultVO){ //判断返回结果是否是SuperEntity的子类 //11为异常,失败 if(resultVO.getCode()==11){ throw new RuntimeException(resultVO.getMsg()); } if(resultVO.getCode()==10){ return resultVO.getData(); } throw new RuntimeException("调用失败"); } /** * 校验ResultVO结果 * 如果code==10则成功其余则失败 * @param resultVO * @return */ public static String checkMsg(ResultVO resultVO){ //判断返回结果是否是SuperEntity的子类 //11为异常,失败 if(resultVO.getCode()==11){ throw new RuntimeException(resultVO.getMsg()); } if(resultVO.getCode()==10){ return resultVO.getMsg(); } throw new RuntimeException("调用失败"); }

}

然后修改AccessDeniedHandler和TokenExceptionHandler,这两个类是无权限和token异常

修改response.setContentType为response.setContentType("application/json; charset=utf-8");

这样安全框架这块就算修改完了。

修改gateway,创建上文中的filter文件夹。

并创建一个filter类

package com.cloudalibaba.gateway.filter;

import com.cloudalibaba.gateway.common.methods.Backtrack;
import com.cloudalibaba.gateway.common.vo.ResultVO;
import com.cloudalibaba.gateway.feign.SecuritypePermissionFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;
import java.util.List;

/**
 * @author wqy
 * @version 1.0
 * @date 2020/8/1 15:23
 */
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered { @Autowired private SecuritypePermissionFeign securitypePermissionFeign; @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("********come in MyLogGatewayFilter:" + new Date()); ServerHttpRequest request = exchange.getRequest(); System.out.println(request.getPath()); System.out.println(request.getQueryParams()); System.out.println(request.getHeaders().get("token")); HttpHeaders headers = request.getHeaders(); List strs = headers.get("token"); //获取token并验证 String token = strs.get(0); System.out.println(token); Boolean check = Backtrack.checkData(securitypePermissionFeign.verificationToken(token)); System.out.println(check); return chain.filter(exchange); } @Override public int getOrder() { return 0; }
}

创建feign,指向securitypermission

package com.cloudalibaba.gateway.feign;

import com.cloudalibaba.gateway.common.vo.ResultVO;
import com.cloudalibaba.gateway.config.CustomizedConfiguration;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @author wqy
 * @version 1.0
 * @date 2020/8/1 16:04
 */
@FeignClient(value = "securitypermission")
public interface SecuritypePermissionFeign { /** * 验证token * @param token * @return */ @RequestMapping(value = "/verificationToken",method = {RequestMethod.POST}) ResultVO verificationToken(@RequestParam("token") String token);

}

这样按正常来说是可以进行调用了,但是!!!,这个是gateway,这样会报错(HttpMessageConverters),请求没问题,但是接受返回值的时候问题就来了,gateway没有对应的解析器去解析response(也可能是默认用错了解析器)。所以要进行一个转换。

package com.cloudalibaba.gateway.config;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import reactor.core.publisher.Mono;

import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 转换器
 * gateway通过feign调用的时候,gateway中没有相应的解析器(返回),所以会出现异常(HttpMessageConverters)
 * 然后将请求转成HttpMessageConverters即可
 * @author wqy
 */
@Configuration
public class GatewayConfig { @Bean KeyResolver userKeyResolver() { return exchange -> Mono.just(Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getAddress().getHostAddress()); } @Bean @ConditionalOnMissingBean public HttpMessageConverters messageConverters(ObjectProvider> converters) { return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList())); }
}

这样就可以正常的访问了。

使用spring cloud alibaba-网关(gateway)+安全认证(springsecurity+jwt)1

最后奉上代码

https://github.com/WPZC/cloudalibaba

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:js,javascript作用域, 全局局部作用域, 全局变量和局部变量, 块级作用域, 作用域链

下一篇:leetcode 338. 比特位计数

您可能感兴趣

  • 使用ASP和Word进行服务器端拼写检查

    编译 甘冀平(2000-09-26) 本文讨论的问题与下列方面相关: Microsoft Word 97 for Windows Microsoft Visual InterDev, version 6.0 Microsoft Internet Information Server version 4.0 概要 本文描述了如何使用Microsoft Word在Web页面ASP文件中添加拼写检...

  • Win32汇编教程三 一个简单的对话框 --- 兼谈资源文件的使用

    --------------------------------------------------------------------------------Windows 的资源文件不管在Dos下编程还是在Windows下编程,我们总是要用到除了可执行文件外的很多其他数据,如声音数据,图形数据,文本等等,在Dos下编程,我们可以自己定义这些文件的格式,但这样一来就造成了很多资源共享的问题...

  • Win32汇编教程六 工具栏和状态栏的使用

    --------------------------------------------------------------------------------有关工具栏和状态栏工具栏和状态栏也是Windows标准界面的组成部分,工具栏一般位于菜单栏的下方,上面是一些系统定义的或自己定义的图片,可以通俗地显示这个按钮的作用。状态栏一般位于窗口的最下方,用来显示程序运行中的一些信息。工具栏和状...

  • 使用Rundll32.exe和Rundll.exe

    福州 Pasic 常用Windows9x的朋友一定对Rundll32.exe和Rundll.exe这两个文件不会陌生吧,不过,由于这两个程序的功能原先只限于在微软内部使用,因而真正知道如何使用它们的朋友想必不多。那么好,如果你还不清楚的话,那么就让我来告诉你吧。  首先,请你做个小实验(请事先保存好你正在运行的程序的结果,否则...

  • 系统钩子的使用

    Win32全局钩子在VC5中的实现  ·贺成士   Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。...

  • 使用ADO操作SQL SERVER 通过'OLE DB 访问 ACCESS 数据库 ,实现数据交换

    使用的存储过程简介1、sp_addlinkedserver --- 为SQL SERVER 添加一个Link Server2、sp_addlinkedsrvlogin --- 为Link Server 添加一个 Login3、sp_droplinkedsrvlogin --- 删除Link Server的Login4、sp_dropserver  --- 删除Link Server详细请参考...

  • 使用MFC编写internet查询程序

    使用MFC编写internet查询程序 杜经农 在VC++ 5.0中,MFC的WinInet类包装了相关的用于internet 客户机程序编程的win32 API函数。这样,无需了解winsock或TCP/IP的细节就可以编制出internet客户机程序。本文中,我们将探讨如何使用WinInet类来编写一个internet查询程序,该程序起名为“探路者”。该程序能使用各种协议来查询网络,包括...

  • C++ articles:Guru of the Week #3:使用标准库

    作者:Hub Sutter译者:plpliuly /*此文是译者出于自娱翻译的GotW(Guru of the Week)系列文章第3篇,原文的版权是属于Hub Sutter(著名的C++专家,"Exceptional C++"的作者)。此文的翻 译没有征得原作者的同意,只供学习讨论。——译者*/ #3 使用标准库难度:3/10 使用标准库提供的算法比你自己手工写一个要方便的多。仍然以Got...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
使用spring cloud alibaba-网关(gateway)+安全认证(springsecurity+jwt)介绍:华为云为您免费提供使用spring cloud alibaba-网关(gateway)+安全认证(springsecurity+jwt)在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多使用spring cloud alibaba-网关(gateway)+安全认证(springsecurity+jwt)的相关内容。| 移动地址: 使用spring cloud alibaba-网关(gateway)+安全认证(springsecurity+jwt) | 写博客