gateway请求拦截_一种网关对用户请求进行统一拦截判断是否放行的方法与流程...

aed7c30a6e2dc44d9831746bc168a865.gif

本发明涉及互联网技术领域,特别涉及一种网关对用户请求进行统一拦截判断是否放行的方法。

背景技术:

随着互联网发展的越来越快,技术也更新的非常频繁,比如开发一个系统的架构由最初始的单个服务器就能处理演变到现在的利用springcloud技术实现的微服务,随着业务的越来越复杂,结构也变得越来越复杂。

技术实现要素:

本发明的目的旨在至少解决所述技术缺陷之一。

为此,本发明的目的在于提出一种网关对用户请求进行统一拦截判断是否放行的方法。

为了实现上述目的,本发明的实施例提供一种网关对用户请求进行统一拦截判断是否放行的方法,包括如下步骤:

步骤s1,当接收到用户的服务请求时,对用户进行登陆是否有效以及该服务请求是否合法进行拦截判断;

步骤s2,根据预先设置的所有url地址和过滤器应忽略的url地址进行判断;

步骤s3,判断url地址是否为有效地址,并判断用户令牌token是否有效;

步骤s4,如果用户不具备该地址访问权限,则过滤返回;如果通过,则对该服务请求进行相关用户信息的请求头的添加。

进一步,在所述步骤s3中,所述判断地址和用户token是否有效,包括:

注册匹配器读取配置文件来获取需要忽略的地址请求,通过注册匹配来判断该服务请求url地址是否属于网关要忽略的地址请求,如果是则进行放行;否则继续进行判断,获取请求头中的token信息,通过token信息从redis数据库中获取用户信息;如果返回异常或者返回的用户信息为空,则请求识别,表示该token信息失效,将错误信息返回到客户端;如果返回的用户信息有效,则将用户信息放到请求的属性attributes中,放行该过滤器。

进一步,判断该服务请求url地址是否属于网关要忽略的地址请求,包括:通过配置文件中的path.skip属性将需要忽略过滤的地址放进忽略权限匹配校验器中,然后对访问的地址进行比较,如果访问地址属于忽略过滤地址,那么进行放行,不再进行token的校验。

进一步,所述判断用户是否具有该url的访问权限,包括:

首先判断该服务请求是否进行直接放行,如果不属于则忽略url地址,判断url地址是否属于合法或者存在url地址;如果不存在则返回资源无法找到信息,将具有的url地址由注册匹配器来获得所拥有的所有合法的url地址,如果请求的url地址存在,则根据api字段id和用户的角色进行调用来判断用户是否具有该url权限的方法,并返回结果,通过结果判断是否需要放行;如果结果中api字段不为空,则将api字段放进请求的属性attributes中。

进一步,从请求中获取前两个过滤器中保存的属性attributes,并通过url编码后保存到请求头中,然后将请求放行,请求到达指定的服务进行相应的处理。

进一步,添加上下文信息,对信息进行url编码,再一次对请求进行过滤,对前两次过滤中的请求头的信息再一次处理,将信息转化为json格式并对用户信息进行url编码,然后进行放行到对应的请求服务中去。

根据本发明实施例的网关对用户请求进行统一拦截判断是否放行的方法,基于springcloudgateway网关过滤器的管理技术,结合redis,mysql数据库,用于用户对服务发出请求时对用户进行登陆是否有效并且请求是否合法的拦截判断,根据预先设置的所有url地址,和过滤器应该忽略的url地址进行判断,判断地址是否为有效地址,判断用户token是否有效,然后如果用户不具备该地址访问的权限,则过滤返回,如果通过,则对请求进行一些有关用户信息的请求头的添加,从而对业务进行请求,一些用户相关的信息可以从请求头中获取。本发明解决了用户登陆失效判断以及url请求无效问题,确保发送到微服务的请求都是有效的。本发明采用网关对用户的请求进行统一的拦截并进行url以及用户登陆是否有效等一系列的判断来决定是否将请求发送到指定的微服务中去,并根据请求路径路由到不同的微服务,保证尽量的简化开发。

本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:

图1为根据本发明实施例的网关对用户请求进行统一拦截判断是否放行的方法的流程图;

图2为根据本发明实施例的网关对用户请求进行统一拦截判断是否放行的方法的示意图。

具体实施方式

下面详细描述本发明的实施例,实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。

本发明提出一种网关对用户请求进行统一拦截判断是否放行的方法,通过判断地址有效性和token有效性、判断用户是否具有该url的访问权限、添加上下文信息,对信息进行url编码,可以保证其它服务收到的请求为安全合法的,以及对添加的请求头数据进行url编码。

如图1和图2所示,本发明实施例的网关对用户请求进行统一拦截判断是否放行的方法,包括如下步骤:

步骤s1,当接收到用户的服务请求时,对用户进行登陆是否有效以及该服务请求是否合法进行拦截判断。

步骤s2,根据预先设置的所有url地址和过滤器应忽略的url地址进行判断。

步骤s3,判断url地址是否为有效地址,并判断用户令牌token是否有效。

具体的,判断地址和用户token是否有效,包括:

注册匹配器读取配置文件来获取需要忽略的地址请求,通过注册匹配来判断该服务请求url地址是否属于网关要忽略的地址请求,如果是则进行放行;否则继续进行判断,获取请求头中的token信息,通过token信息从redis数据库中获取用户信息;如果返回异常或者返回的用户信息为空,则请求识别,表示该token信息失效,将错误信息返回到客户端;如果返回的用户信息有效,则将用户信息放到请求request的属性attributes中,放行该过滤器。

在本发明的实施例中,判断该服务请求url地址是否属于网关要忽略的地址请求,包括:通过配置文件中的path.skip属性将需要忽略过滤的地址放进忽略权限匹配校验器中,然后对访问的地址进行比较,如果访问地址属于忽略过滤地址,那么进行放行,不再进行token的校验。

步骤s4,如果用户不具备该地址访问权限,则过滤返回;如果通过,则对该服务请求进行相关用户信息的请求头的添加。

在本步骤中,判断用户是否具有该url地址的访问权限,包括如下步骤:

首先判断该服务请求是否进行直接放行,判断此次过滤是否需要放行忽略地址,如果不属于则忽略url地址,用url匹配校验器判断请求的url地址是否属于合法或者存在url地址(匹配校验器通过mysql数据库中的api表将系统api注册进匹配校验器中,如果url匹配不成功,那么返回资源找不到);如果不存在则返回资源无法找到信息,然后从请求头中找到current-context(由第一个过滤器通过token从redis中找到用户信息保存到该请求头中),获取对应的值就是用户信息,从用户信息中得到所拥有的角色,然后利用urlapi匹配工具获取到该路径所对应的apiid,然后根据id和用户角色想对应的资源校验服务发起请求,通过匹配数据库中role_api表,api_column表得到api字段结果,如果失败,说明该用户不具备该url的访问权限,如果成功,那么将用户具有的api字段信息权限放入到columnids请求头中,进行放行。

将具有的url地址由注册匹配器来获得所拥有的所有合法的url地址,如果请求的url地址存在,则根据api字段id和用户的角色进行调用来判断用户是否具有该url权限的方法,并返回结果,通过结果判断是否需要放行;如果结果中api字段不为空,则将api字段放进请求的属性attributes中。

在本步骤中,从request请求中获取前两个过滤器中保存的属性attributes,并通过url编码后保存到请求头中,然后将请求放行,请求到达指定的服务进行相应的处理。

添加上下文信息,对信息进行url编码,再一次对请求进行过滤,对前两次过滤中的请求头的信息再一次处理,将信息转化为json格式并对用户信息进行url编码,然后进行放行到对应的请求服务中去,返回请求结果。

根据本发明实施例的网关对用户请求进行统一拦截判断是否放行的方法,基于springcloudgateway网关过滤器的管理技术,结合redis,mysql数据库,用于用户对服务发出请求时对用户进行登陆是否有效并且请求是否合法的拦截判断,根据预先设置的所有url地址,和过滤器应该忽略的url地址进行判断,判断地址是否为有效地址,判断用户token是否有效,然后如果用户不具备该地址访问的权限,则过滤返回,如果通过,则对请求进行一些有关用户信息的请求头的添加,从而对业务进行请求,一些用户相关的信息可以从请求头中获取。本发明解决了用户登陆失效判断以及url请求无效问题,确保发送到微服务的请求都是有效的。本发明采用网关对用户的请求进行统一的拦截并进行url以及用户登陆是否有效等一系列的判断来决定是否将请求发送到指定的微服务中去,并根据请求路径路由到不同的微服务,保证尽量的简化开发。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。

尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在不脱离本发明的原理和宗旨的情况下在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。本发明的范围由所附权利要求及其等同限定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过实现GatewayFilter接口来拦截post请求,并在请求中添加参数。 以下是一个示例代码,你可以在其中编写自己的逻辑: ```java @Component public class CustomGatewayFilter implements GatewayFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest.Builder builder = request.mutate(); if (request.getMethod() == HttpMethod.POST) { // 添加参数 MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>(); queryParams.add("param1", "value1"); queryParams.add("param2", "value2"); // 替换请求体 Flux<DataBuffer> body = exchange.getRequest().getBody(); String bodyStr = DataBufferUtils.join(body).block().toString(StandardCharsets.UTF_8); bodyStr += "&" + URLEncodedUtils.format(queryParams, StandardCharsets.UTF_8); byte[] bytes = bodyStr.getBytes(StandardCharsets.UTF_8); DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes); builder = builder.method(request.getMethod()) .headers(httpHeaders -> { httpHeaders.addAll(request.getHeaders()); }) .body(Mono.just(buffer)); // 设置Content-Type exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_FORM_URLENCODED); } ServerHttpRequest newRequest = builder.build(); return chain.filter(exchange.mutate().request(newRequest).build()); } } ``` 此过滤器将会在请求为POST方法时,添加两个参数param1和param2,并将参数拼接到请求体中。最后将请求体重新封装,并设置Content-Type为application/x-www-form-urlencoded。你可以根据自己的需要,修改这个过滤器的代码逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值