簡體   English   中英

Spring MVC - 僅允許來自本地主機的請求到特定控制器

[英]Spring MVC - allowing requests from localhost only to specific controller

我有一個特定的控制器(在許多其他控制器中)。 我想允許僅從本地主機調用的對這個控制器的請求。 什么是最好的方法來做到這一點?

這是控制器:

@Controller
public class LocalProvider {

@RequestMapping(value = "/someURL", method = RequestMethod.POST)
@ResponseBody
public responseDTO doSomethingForLocalRequest(@RequestBody ReqDTO reqDTO ) {

//do something
}

編輯 :

通過將以下內容添加到 spring security.xml 中,成功實現了這一目標:

<intercept-url pattern="/someURL/*" access="hasIpAddress('127.0.0.1')" />

我將創建一個自定義注釋@LocalhostOnly和一個 MVC 攔截器,用於檢查處理程序方法是否使用@LocalhostOnly注釋,在這種情況下,檢查從HttpServletRequest.getRemoteAddr()獲取的遠程 IP 地址是否確實是本地主機。

如果您正在使用 spring 安全性,那么正如 NimChimpsky 建議的那樣,最好將遠程 ip 檢查插入其中。 您可以定義一個自定義權限評估器來檢查遠程 IP 地址。

您還可以使用 servlet 過濾器並在那里對特定 URL(例如/someURL** )進行本地主機檢查。

最后,請注意,如果您將在某個時候在反向代理后面運行應用程序,則所有請求看起來都來自本地主機(即,如果反向代理安裝在同一主機上)。 在這種情況下,您需要從X-Forwarded-For標頭中獲取 IP 地址。

編輯

Spring security 實際上有 ip 檢查表達式hasIpAddress('127.0.0.1')所以 NimChimpsky 的答案可能是最好的方法。

spring-security 提供了可用於類型或方法的 @PreAuthorize 注釋,因此<intercept-url>的替代方案可以是@PreAuthorize("hasIpAddress('127.0.0.1')")

要限制對整個網絡服務器的訪問,您可以使用

<Connector port="8080" address="127.0.0.1" maxHttpHeaderSize="8192"

在 tomcat 的服務器 xml 中(或在不同的應用程序服務器中類似)。

對於一個應用程序,使用添加 allow="localhost" 到上下文:

<Context>
    <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="localhost"/>
</Context>

但是對於特定的控制器方法,最好使用 spring 安全性。

解決方案是使用以下表達式:

@PreAuthorize("#request.getRemoteAddr().equals(#request.getLocalAddr())")

正如第一條評論所建議的那樣,如果缺少@P("request") HttpServletRequest參數,則使用#request將顯示Failed to evaluate expression錯誤。

完整解決方案:

@PreAuthorize("#request.getRemoteAddr().equals(#request.getLocalAddr())")
@PostMapping("/doSomething")
public void myMethod(@P("request") HttpServletRequest request) {
    ...
}

這是一個可能的解決方案:

腳步:

  • 編寫一個監聽器,在啟動時獲取服務器端主機名或ip,並將其存儲在某處,
  • 添加ServletRequest作為方法的參數
  • 在方法內部獲取客戶端主機名: ServletRequest.getServerName(...)
  • 比較客戶端和服務器的ip或主機,
  • 如果是本地的,那么處理它,
  • 如果不是本地的,那么忽略它,可選擇給出一些提示,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM