微服务网关自定义权限(微服务网关功能)

网友投稿 488 2023-01-06


本篇文章给大家谈谈微服务网关自定义权限,以及微服务网关功能对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享微服务网关自定义权限的知识,其中也会对微服务网关功能进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

微服务权限终极解决方案(spring-cloud-gateway-oauth2)

我们理想的微服务权限解决方案应该是这样的,认证服务负责认证,网关负责校验认证和鉴权,其他API服务负责处理自己的业务逻辑。安全相关的逻辑只存在于认证服务和网关服务中,其他服务只是单纯地提供服务而没有任何安全相关逻辑。

通过认证服务( oauth2-auth )进行统一认证,然后通过网关( oauth2-gateway )来统一校验认证和鉴权。采用Nacos作为注册中心,Gateway作为网关,使用nimbus-jose-jwtJWT库操作JWT令牌。

接下来搭建网关服务,它将作为Oauth2的资源服务、客户端服务使用,对访问微服务的请求进行统一的校验认证和鉴权操作

最后我们搭建一个API服务,它不会集成和实现任何安全相关逻辑,全靠网关来保护它

在此之前先启动我们的 Nacos 和 Redis 服务,然后依次启动 oauth2-auth 、 oauth2-gateway 及 oauth2-api 服务

我这里测试使用的 Docker 跑的单机版的 Nacos

github.com/it-wwh/spring-cloud-gateway-oauth2

Spring Cloud Gateway + Jwt + Oauth2 实现网关的鉴权操作

随着我们的微服务越来越多,如果每个微服务都要自己去实现一套鉴权操作,那么这么操作比较冗余,因此我们可以把鉴权操作统一放到网关去做,如果微服务自己有额外的鉴权处理,可以在自己的微服务中处理。

1、在网关层完成url层面的鉴权操作。

2、将解析后的jwt token当做请求头传递到下游服务中。
3、整合Spring Security Oauth2 Resource Server

1、搭建一个可用的认证服务器, 可以参考之前的文章.
2、知道Spring Security Oauth2 Resource Server资源服务器如何使用, 可以参考之前的文章.

自定义授权管理器,判断用户是否有权限访问
此处我们简单判断
1、放行所有的 OPTION 请求。
2、判断某个请求(url)用户是否有权限访问。
3、所有不存在的请求(url)直接无权限访问。

1、 客户端 gateway 在认证服务器拥有的权限为 user.userInfo

3、在网关层面,findAllUsers 需要的权限为 user.userInfo ,正好 gateway 这个客户端有这个权限,所以可以访问。

演示GIF

https://gitee.com/huan1993/spring-cloud-alibaba-parent/tree/master/gateway-oauth2

getway不校验白名单怎么设置


lovenuo1314 
码龄11年
关注
1、若依后端gateway模块配置白名单
顾名思义,就是允许访问的地址。且无需登录就能访问。在ignore中设置whites,表示允许匿名访问。
1.1、在nacos中gateway配置文件中配置

1.2、代码
package com.ruoyi.gateway.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.HttpStatus;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.TokenConstants;
import com.ruoyi.common.core.utils.JwtUtils;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties;
import io.jsonwebtoken.Claims;
import reactor.core.publisher.Mono;
/**
* 网关鉴权
*
* @author ruoyi
*/
@Component
public class AuthFilter implements GlobalFilter, Ordered
{
private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
// 排除过滤的 uri 地址,nacos自行添加
@Autowired
private IgnoreWhiteProperties ignoreWhite;
@Autowired
private RedisService redisService;
@Override
public Mono<Void filter(ServerWebExchange exchange, GatewayFilterChain chain)
{
ServerHttpRequest request = exchange.getRequest();
ServerHttpRequest.Builder mutate = request.mutate();
String url = request.getURI().getPath();
// 跳过不需要验证的路径
if (StringUtils.matches(url, ignoreWhite.getWhites()))
{
return chain.filter(exchange);
}
String token = getToken(request);
if (StringUtils.isEmpty(token))
{
return unauthorizedResponse(exchange, "令牌不能为空");
}
Claims claims = JwtUtils.parseToken(token);
if (claims == null)
{
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
}
String userkey = JwtUtils.getUserKey(claims);
boolean islogin = redisService.hasKey(getTokenKey(userkey));
if (!islogin)
{
return unauthorizedResponse(exchange, "登录状态已过期");
}
String userid = JwtUtils.getUserId(claims);
String username = JwtUtils.getUserName(claims);
if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username))
{
return unauthorizedResponse(exchange, "令牌验证失败");
}
// 设置用户信息到请求
addHeader(mutate, SecurityConstants.USER_KEY, userkey);
addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
// 内部请求来源参数清除
removeHeader(mutate, SecurityConstants.FROM_SOURCE);
return chain.filter(exchange.mutate().request(mutate.build()).build());
}
private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value)
{
if (value == null)
{
return;
}
String valueStr = value.toString();
String valueEncode = ServletUtils.urlEncode(valueStr);
mutate.header(name, valueEncode);
}
private void removeHeader(ServerHttpRequest.Builder mutate, String name)
{
mutate.headers(httpHeaders - httpHeaders.remove(name)).build();
}
private Mono<Void unauthorizedResponse(ServerWebExchange exchange, String msg)
{
log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath());
return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
}
/**
* 获取缓存key
*/
private String getTokenKey(String token)
{
return CacheConstants.LOGIN_TOKEN_KEY + token;
}
/**
* 获取请求token
*/
private String getToken(ServerHttpRequest request)
{
String token = request.getHeaders().getFirst(TokenConstants.AUTHENTICATION);
// 如果前端设置了令牌前缀,则裁剪掉前缀
if (StringUtils.isNotEmpty(token) token.startsWith(TokenConstants.PREFIX))
{
token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
}
return token;
}
@Override
public int getOrder()
{
return -200;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package com.ruoyi.gateway.config.properties;
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
* 放行白名单配置
*
* @author ruoyi
*/
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "security.ignore")
public class IgnoreWhiteProperties
{
/**
* 放行白名单配置,网关不校验此处的白名单
*/
private List<String whites = new ArrayList<();
public List<String getWhites()
{
return whites;
}
public void setWhites(List<String whites)
{
this.whites = whites;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
启动代码并测试

已经走到了sytem模块中,并且没有进行登录;说明我们的配置已经生效
文章知识点与官方知识档案匹配
Java技能树首页概览
84637 人正在系统学习中
打开CSDN,阅读体验更佳
Amazon API Gateway使用IP白名单控制后端服务访问_亚林瓜子的博客-CSD...
异地IP验证 使用移动IP调用,请求被拒绝了。 白名单IP验证 同样的请求,在白名单中的IP就可以正常请求。 总结 这里使用的AWS中国北京地区的API Gateway服务,通过策略控制对后台服务的访问控制。
SpringCloud Gateway网关配置(二)接口访问IP白名单配置(真实IP)
SpringCloud Gateway网关配置中,需要对访问的IP设置白名单,SpringCloud Gateway官方给出YML配置文件配置。 如下: 5.10. The RemoteAddr Route Predicate Factory The RemoteAddr route predicate factory takes a list (min size 1) of so...
Spring Cloud Gateway 网关实现白名单功能
对于微服务后台而言,网关层作为所有网络请求的入口。一般基于安全考虑,会在网关层做权限认证,但是对于一些例如登录、注册等接口以及一些资源数据,这些是不需要有认证信息,因此需要在网关层设计一个白名单的功能。本文将基于 Spring Cloud Gateway 2.X 实现白名单功能。注意事项: Gateway 网关层的白名单实现原理是在过滤器内判断请求地址是否符合白名单,如果通过则跳过当前过滤器。如果有多个过滤器,则需要在每一个过滤器里边添加白名单判断。......
继续访问
若依vue分离版(ruoyi-vue)跳过token验证,设置白名单
找到SecurityConfig类的configure方法 如图所示 在设置白名单后还需要把接口上的权限标识符去掉。然后需要重启一下项目,热加载不行,会报错。
继续访问

Kong Gateway - 13 基于网关服务的IP白名单限制访问(Whitelist IP Restri...
为名称为book的服务的路由{route_id启用IP白名单限制访问其中192.168.10.50表示限制macOS系统这一台计算机不能访问book服务的路由其中192.168.43.0/24表示限制IP地址是192.168.43这一整个网段的IP都不能访问book服务的路由(Windows 10在此...
服务网关:Gateway_青铜造白的博客
可以实现日志拦截、权限控制、解决跨域、限流、熔断、负载均衡,隐藏服务端的ip,黑名单与白名单拦截、授权等。 二:gateway的核心概念 1、Route(路由):就是转发规则 Spring Cloud Gateway的基础元素,可简单理解成一条转发的规则。包含:ID...
SpringCloud Gateway网关配置(二)接口访问IP白名单配置(真实IP)
SpringCloud Gateway网关配置中,需要对访问的IP设置白名单,SpringCloud Gateway官方给出YML配置文件配置。 如下: 5.10. The RemoteAddr Route Predicate Factory The RemoteAddr route predicate factory takes a list (min size 1) of sources, which are CIDR-notation (IPv4 or IPv6) strings, such as 1
继续访问
nacos权限认证(二) 开启权限认证
直接设置下述属性为true,就可以避免 nacos权限认证(一) 中的问题。 这个时候再访问nacos页面,则会直接报错。因此,还需要再设置两个属性(数值可以随便填)。添加好这两个属性时页面就能正常访问了。注意:如果你遇到这种情况,只需要关闭提示,点击用户名,登出,然后重新登录即可。这个时候,如果你加修改直接启动其他服务,则其他服务无法正常连接nacos,也需要坐一番配置。需要再其他服务的配置文件中加上如下配置。 这样,其他服务就能正常连接nacos了。至此,nacos的权限漏洞问题就解决了。
继续访问

若依RuoYi-Cloud代码学习三---ruoyi-gateway扩展gateway网关组件的知识
一、API 网关概述 作为微服务的门面,应用于服务数量众多、复杂度较高、规模比较大的系统。 优点: 客户端通过 API 网关与微服务交互时,客户端只需要知道 API 网关地址即可,而不需要维护大量的服务地址,简化了客户端的开发。 客户端直接与 API 网关通信,能够减少客户端与各个服务的交互次数。 客户端与后端的服务耦合度降低。 节省流量,提高性能,提升用户体验。 API 网关还提供了安全、流控、过滤、缓存、计费以及监控等 API 管理功能。 常见API 网关实现方案 Spring Cloud G
继续访问
热门推荐 GateWay中添加白名单
最近开发中有一个鉴权的操作,最后需要进行添加白名单的,废话不多说,直接上代码吧, 这是我的项目结构 applicaton启动类: import org.springframework.boot.SpringApplication; import org.springframework.cloud.client.SpringCloudApplication; import org.spr...
继续访问

Spring Gateway+白名单+docker
域名解析 从物理机上调用外部服务正常,但是docker里的java服务去调用却有问题。 答案 docker并不能使用宿主机的host配置信息 为每一个http请求定制header 如果在RouteLocatorBuilder里设置header的话就会对所有http request生效,如果为了对每个request请求使用不同header需要如下设置 @Configuration public cl...
继续访问
GateWay网关应用案例(跨域、限流、黑白名单)
Spring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 构建的。属于异步非阻塞架构 Spring Cloud Gateway与Spring Data 和Spring Securit 技术不能同时使用 Spring Cloud Gateway基于Spring Boot和Spring Webflux提供的Netty运行。它在传统的Servlet容器中或用WAR的方式构建时不起作用 网关基本的功能 :鉴权、流量控制、熔断、路径重写
继续访问

ruoyi分离版前端白名单
ruoyi分离版前端白名单 先在router下的index.js中加上需要添加的路由 之后再permission.js下的whiteList中加上上面添加的路由就可以了 后端的接口 接口白名单 /**是匹配路径下的所有接口,也可以直接指定某一个具体的接口 ...
继续访问
若依后端gateway模块解决跨域问题
跨域问题
继续访问

微服务项目在gateway网关配置路径访问白名单
网关的鉴权:权限身份认证作用实际上就是由一串组合起来的过滤器实现的, 过滤器的自定义过程就是实现两个接口org.springframework.cloud.gateway.filter.GlobalFilter和org.springframework.core.Ordered 通过重写org.springframework.cloud.gateway.filter.GlobalFilter中的filter方法来定义过滤的逻辑 通过重写org.springframework.core.Ordered中的get
继续访问
若依微服务SpringCloud—使用Spring Cloud Gateway网关
一.API网关 API网关,就是指系统的统一入口,它封装来应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证,鉴权,监控,路由转发等等。 二.业界流行的网关 (1)Ngnix+lua :使用nginx的反向代理和负载均衡可实现api服务器的负载均衡及高可用。lua是一种脚步语言,可以来编写一些简单的nginx支持lua脚本。 (2)Kong:基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流,鉴权等等)可以开箱即用。缺点:只支持http协
继续访问

最新发布 若依前后端分离ruoyi-vue请求添加白名单403
【代码】若依前后端分离ruoyi-vue请求添加白名单403。
继续访问

Nacos配置与踩坑总结
核心问题: 1.不同域名,走不同配置 2.开关、配置、JSON三种配置类型 解决方案 设计思路: 1.分三大类: 业务配置、域名配置、域名自定义配置 业务配置:用于配置所有业务中的配置信息 针对业务情况,分为三类业务配置:开关配置、基础配置、数据配置(黑/白名单) 每种配置都为单独的nacos 针对大促情况:将三类配置各自再两个环境配置,共三个环境配置,方便在不同配置环境中自由切换 域名配置:用于配置域名走哪个配置环境,实现出现问题快速将某域名切换到不同环境 域
继续访问

微服务网关springcloud gateway自定义全局过滤器
微服务网关springcloud gateway自定义全局过滤器
继续访问
ruoyi-spring boot 升级为nacos配置
springboot集成nacos
继续访问
若依Cloud之旅(二):一次登录到出现界面,若依做了什么?
若依一次登录到出现界面的三个接口都做了什么
继续访问

实现登录验证
最近练习搭建了一个后台管理系统,首先第一步做了关于验证登录的功能.以下项目使用了Nacos作为服务发现和注册中心,将Auth和gateway,system等相关多个微服务注册进Nacos.每次刷新登录页面,就会获取新的验证码(,输入正确的验证码即可成功跳转至首页. 获取验证码url:http://localhost/dev-api/code - dev-api是前端设置的反向代理,实际访问的是网关路径和端口.即在网关gateway模块做了路由转发.返回给前端 /** * 路由转发...
继续访问
若依前后端分离-免登录
项目需要对若依进行不输入账号密码的登录,所以临时进行修改,增加获取不到token时,判断是否携带了某个特殊参数,有就用默认的账号密码调用登录达到验证登录的需求。 http://localhost/#/?index=1 // 没有token if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入 next() } else if (to.query.index === '1') { let..
继续访问

gateway白名单
gateway

关于微服务网关自定义权限和微服务网关功能的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 微服务网关自定义权限的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于微服务网关功能、微服务网关自定义权限的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微服务网关租户(微服务只能通过网关访问)
下一篇:报表系统接口设计方案(报表系统接口设计方案)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~