使用springcloudalibaba-网关(gateway)+安全认证(springs。。。

使⽤springcloudalibaba-⽹关(gateway)+安全认证
(springs。。。
上⼀篇博客开头说到了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<Boolean> verificationToken(@RequestParam("token") String token){
AuthUser authUser = JwtUtil.parseToken(token);
粉蝶儿和晋臣赋落花
return Backtrack.success(true);
}
此⽅法供gateway调⽤,Backtrack为⼀个统⼀返回和接收校验的类,⽤于抛请求异常。
package com.hods;
import com.cloudalibaba.securitypermissionmon.vo.ResultVO;
/**
* 返回和接收校验
* @author wqy
* @version 1.0
* @date 2020/6/9 15:52
*/
public class Backtrack{
/**
* 成功的执⾏
* @param t 数据体
* @param msg 备注
* @param <T> 泛型
* @return
*/
public static <T> ResultVO<T> success(T t, String msg){
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(10);
resultVO.setData(t);现代化经济体系的战略支撑
resultVO.setMsg(msg);
return resultVO;
}
/**
/**
* 成功的执⾏
* @param t 数据体
* @param <T> 泛型
* @return
*/
public static <T> ResultVO<T> success(T t){
ResultVO<T> resultVO = new ResultVO<>();
湖北理工学院人文社科部
resultVO.setCode(10);
resultVO.setData(t);
return resultVO;
}
/
**
* 成功的执⾏
* @param msg 备注
* @param <T> 泛型
* @return
*/
public static <T> ResultVO<T> success(String msg){        ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(10);
resultVO.setMsg(msg);
return resultVO;
}
/**
* 失败的执⾏
* @param t 数据体
* @param msg 备注
* @param <T> 泛型
* @return
*/
public static <T> ResultVO<T> errot(T t,String msg){
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(11);
resultVO.setData(t);
resultVO.setMsg(msg);
return resultVO;
}
/**
* 失败的执⾏
* @param msg 备注
* @param <T> 泛型
* @return
*/
public static <T> ResultVO<T> errot(String msg){
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(11);
resultVO.setMsg(msg);
return resultVO;
}
/**
* 校验ResultVO结果
* 如果code==10则成功其余则失败
* @param resultVO
* @return
*/
public static <T> T checkData(ResultVO<T> resultVO){
/
/判断返回结果是否是SuperEntity的⼦类
//11为异常,失败
Code()==11){
throw new Msg());
}
Code()==10){
Data();
}
throw new RuntimeException("调⽤失败");
}
/**
* 校验ResultVO结果
* 如果code==10则成功其余则失败
文史哲* @param resultVO
* @return
*/
public static String checkMsg(ResultVO<String> resultVO){
//判断返回结果是否是SuperEntity的⼦类
//11为异常,失败
Code()==11){
throw new Msg());
}
Code()==10){
Msg();
}
throw new RuntimeException("调⽤失败");
}
}
然后修改AccessDeniedHandler和TokenExceptionHandler,这两个类是⽆权限和token异常
修改response.setContentType为response.setContentType("application/json; charset=utf-8");这样安全框架这块就算修改完了。
修改gateway,创建上⽂中的filter⽂件夹。
并创建⼀个filter类
import com.hods.Backtrack;
import com.cloudalibaba.gatewaymon.vo.ResultVO;
import com.cloudalibaba.gateway.feign.SecuritypePermissionFeign;
slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.active.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
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<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("********come in MyLogGatewayFilter:" + new Date());
ServerHttpRequest request = Request();
System.out.Path());
System.out.QueryParams());
System.out.Headers().get("token"));
HttpHeaders headers = Headers();
List<String> strs = ("token");
//获取token并验证
String token = (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
import com.cloudalibaba.gatewaymon.vo.ResultVO;
import com.fig.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<Boolean> verificationToken(@RequestParam("token") String token);
}
这样按正常来说是可以进⾏调⽤了,但是,这个是gateway,这样会报错(HttpMessageConverters),请求没问题,但是接受返回值的时候问题就来了,gateway没有对应的解析器去解析response(也可能是默认⽤错了解析器)。所以要进⾏⼀个转换。

本文发布于:2024-09-22 07:15:10,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/298148.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:问题   返回   解析器   时候   移除
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议