我是这样想的每个请求都是先到 zuul 网关,然后网关配置好了路由调用,只需要在 zuul 上做权限控制就好了;但是每个微服务还是暴露在网络中,所以每个微服务需要一个简单的验证,只需要判断是 zuul 发送过来的请求。所以我在 zuul 上加了一个 type 为 route 的 ZuulFilter 加了一个头( zuul-authorization )用来验证,每个微服务去检查这个头的内容来判断是否通过,但是现在问题又来了,当一个请求 zuul->serviceA 但是 serviceA 中又调用了 serviceB 时 ,问题来了:serviceA 可以获取 Zuul 设置的头( zuul-authorization )但是 serviceA 通过 fein 调用 ServiceB 的时候不会把 zuul-authorization 传递下去,这样 serviceB 就报没有权限了。 我这个想法是不是太绕了?不知道真实项目中是怎么解决这个问题的
1
banmuyutian 2019-07-10 19:02:01 +08:00
微服务部署在内网,只对外开放网关不就好了吗
|
2
GM 2019-07-10 19:03:51 +08:00
你可以参考一下 jhipster 是怎么实现的。
|
3
hly9469 2019-07-10 19:07:22 +08:00 via iPhone
我们用 k8s 解决的~
|
4
ErrorMan 2019-07-10 19:23:33 +08:00
其它服务丢内网,zuul 是 API 网关暴露给外面的,其它服务不应该能被正常用户访问
|
5
wz497345846 OP |
6
arrow8899 2019-07-10 19:53:08 +08:00
Service mesh
|
7
CloudnuY 2019-07-10 19:54:01 +08:00
@wz497345846 #5 防火墙加黑白名单就行
|
8
arrow8899 2019-07-10 19:57:00 +08:00
@wz497345846 云服务也有私有云啊,跟局域网是一样的
|
9
ourslay 2019-07-10 19:58:25 +08:00
没有 用 spring-security 的话。就 用 ZuulFilter 来判断 请求路径然后来检查 token 就行了。
用 spring-security 的话非常简单。加个规则就行 pathMatchers("/user/**").authenticated()。 假如:service A 在 zuul 里面映射的 path 是 /user/ 。 网关后面 service A ,service B .可以不用加鉴权,统一在网关上面鉴权一次就行了。 Feign 的话就正常调用就行了 |
10
LemonCoo1 2019-07-11 09:12:09 +08:00
如果用 springsecurity 话就上 oauth2 那一套机制,至于你说的请求头问题,用 feign 拦截器实现,具体代码自己 google
|
11
Aresxue 2019-07-12 11:12:29 +08:00
用 feign 提供的拦截器 hook 处理一下,但建议不要用 feign 调用,最好自定义一套类似 RPC 调用的脚手架,核心是用 RestTemplate 发送请求,这样对 http 连接做管理和处理都很方便
|