想来请教一下各位大佬,如下场景如何实现:
现在服务器有两个 SpringBoot 应用 A 和 B,现在 A 应用需要调用 B 的相关读写接口对某一类数据读写, 但是不希望外部请求直接访问 A 应用提供的 API 来对该类数据进行读写,即该类数据只能由 B 来调用, 个人理解为就是应用 A 对应用 B 授权,然后只有授权了应用才能访问相应的 API,其他外部请求直接拒绝。
不知道这种场景有什么比较好的实现方式。或者业界有没有什么比较标准的做法?
1
Resource 2020-03-09 16:14:53 +08:00
没看懂,我可能语文不太好
|
2
tcfenix 2020-03-09 16:16:37 +08:00
a 弄一个 auth key 的库,然后对每个可以调用 a 的业务身份随机生成一个 auth key,
b 请求的时候带着业务身份跟 auth key |
3
lincya 2020-03-09 16:16:46 +08:00
感觉跟缺个登录机制一样。。。
|
4
zhenjiachen 2020-03-09 16:18:13 +08:00
你只要是接口就可能被别人调用,可以用签名或者 oauth2 调用,只要 key 不泄漏别人可以调用你的接口,但是肯定会被拦截
|
5
manami 2020-03-09 16:18:33 +08:00 via Android
怎么感觉就是单点登录集成机制?
|
7
Vanes OP @zhenjiachen 所以可能还是跟普通的带 token 来访问资源的一样是吗? 因为总感觉这样的话有后门
|
9
goldpumpkin 2020-03-09 16:28:19 +08:00
请求的时候,带上系统标识,进行校验
|
10
Kontinue 2020-03-09 16:28:54 +08:00
API 做个认证不就行了?简单的搞个 token,负载的走阿里云 API 那套。
https://help.aliyun.com/document_detail/29475.html?spm=a2c4g.11186623.2.13.2aa44ae01LxLfD |
11
Kontinue 2020-03-09 16:29:40 +08:00
复杂的
|
12
HangoX 2020-03-09 16:30:05 +08:00
不用那么麻烦啊。。。你内部用内部域名访问,不是来自这几个域名的直接 ban 掉不就好了。
|
13
tinybaby365 2020-03-09 16:31:48 +08:00
实现一个 HandlerInterceptor,验证请求方(基于 IP or JWT,随你怎么搞),验证通过的在 HttpServletRequest 里 setAttribute(加个 trusted 标记)。在你的那个 RestController 接口读取 HttpServletRequest 的那个 attribute,判断是否受信。
|
15
Vanes OP @tinybaby365 就和楼上有位老哥的想法一致,用 request 的参数来控制。 然后是不是只需要担心参数是否被猜到?
|
16
tinybaby365 2020-03-09 16:35:39 +08:00
@tinybaby365 此方法的改进是,自定义一个 annotation,HandlerInterceptor 里面判断是否有这个 annotation,有则验证,否则直接 sendError。你的接口加上这个 annotation 就是限制内部访问。
|
17
sagaxu 2020-03-09 16:36:28 +08:00 via Android
硬是没看明白是 a 调用 b,还是 b 调用 a
|
18
tinybaby365 2020-03-09 16:38:25 +08:00
@Vanes JWT + https 了解一下。或者 Mutual TLS。
|
19
renyijiu 2020-03-09 16:39:13 +08:00
我们系统是 header 增加一个特定参数,带有系统 token 校验,另外自定义个注解 @Internal 标识内部接口
|
20
Vanes OP @tinybaby365 所以就得改写原有的 Token 颁发机制,里面加一个类似于 trusted 的标记的属性是吗?
|
22
renyijiu 2020-03-09 16:49:40 +08:00
@Vanes #21 通过注解判断内外部接口,从而进行不同的校验(客户端的请求需要签名等验证),另外外层有网关,可以设置名单内部接口拒绝外部访问
|
23
0ray 2020-03-09 17:42:47 +08:00
为啥一定要用调 api, 作成 rpc 通信不好吗, 集成 dubbo 很容易的.
|
24
mazyi 2020-03-09 18:11:48 +08:00
给一把钥匙不就行了。。。
|
25
NizumaEiji 2020-03-09 18:30:15 +08:00
写过滤器\拦截器带个鉴权也行
或者直接 b 机器上本地改下 dns a 机器的 ng 上弄个规则 特定的接口拒绝外网 ip 访问也行吧 |
26
m1ch3ng 2020-03-09 19:19:13 +08:00
用 token 的机制不就可以(必须携带某些请求头)
|
27
mosliu 2020-03-09 22:55:28 +08:00
做鉴权不行么 ?
|
28
wozhizui 2020-03-10 07:46:20 +08:00
这应该就是加权限的 api 吧,行业软件的 api 经常都这么搞,给个调用者一个 key,请求的时候带上 key,然后应用 B 返回 200 ok 或者 400 不 ok。
已经有挺专业的回答了。 |
29
CRUD 2020-03-10 10:30:44 +08:00
1、A 应用只对 B 应用提供服务的情况下可关闭外网访问,B 请求 A 走内网。
2、A 应用除了对 B 应用提供服务,还需要对其他应用提供服务的情况下引入鉴权机制,可以是 token 也可以是 auth key,本质上只是 A 服务颁发给调用它的客户端的一个凭证,请求时带上该凭证,验证通过执行剩余逻辑,验证错误拒绝请求而已。 |
30
Leiothrix 2020-03-10 11:03:48 +08:00
B 应用配置 Spring Security 规则,只暴露该暴露出去的接口,A 应用后台登录后可以无阻碍访问 B 应用未暴露(保护)接口。
|
31
HansCathy 2020-03-10 11:21:55 +08:00
我理解 B 是对外接口,A 是对内接口。在网关配置 A 为登录验证,B 为匿名验证 就可以了
|
32
xyshmily 2020-03-10 14:01:16 +08:00
ng 白名单
|