我们有2个不同的Web应用程序在同一个tomcat上运行。
webapp#1,webapp#2。
Webapp#1通过此服务方法连接到webapp#2:
this.restTemplate.postForObject(url,
request,
responseType);
webapp#2正在以下控制器中接收此请求:
@RequestMapping(value = "/bla", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public ResponseDTO requestSomething(@RequestBody RequestDTO requestDTO, HttpServletRequest request) {
return new ResponseDTO("Hello");
}
现在,我们有一个安全要求,我们在webapp#2中透露的这个控制器只会收到来自webapp#1的请求。
实现这一目标有哪些替代方案?我们是否必须从webapp#1在webapp#2中创建一个新会话?如果是这样,凭据来自哪里?我们应该就预定义的东西达成一 春季安全有没有办法解决这个问题?
谢谢!
答案 0 :(得分:2)
如果有人能告诉我在同一个容器中是否有特殊(和好)的webapps方式,我很高兴,但AFAIK可以选择这些:
选项1:忽略它们属于同一个Tomcat
换句话说,就像两个webapps位于两个不同的位置一样。例如,您可以使用HTTP Basic authentication; ClientHttpRequestFactory
实现在客户端添加RestTemplate
的Authorization标头(webapp#1)并且Spring Security内置支持在服务器端处理它(webapp#)相当容易2)。使用基本身份验证,通信可以是无状态的,不需要会话。唯一的缺点是两个网络应用都需要知道凭证。
选项2:检查localhost
这个想法是在webapp#2中检查请求的来源。将ServletRequest.getRemoteAddr()
与127.0.0.1(或任何其他环回地址)进行比较。如果要应用Spring Security,则需要在安全链中创建自定义筛选器。优势:webapp#1不需要任何凭据。缺点:根据您的服务器设置,这可能是不安全的!如果用户可以打开计算机上的连接,则可以假装为webapp#1。如果机器上有某种代理,请格外小心。