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