2014-04-23 58 views
10

我有一個特定的控制器(在許多其他控制器中)。 我想只允許從本地主機調用此控制器的請求。 最好的辦法是做什麼?Spring MVC - 只允許來自本地主機的請求到特定的控制器

這裏是控制器:

@Controller 
public class LocalProvider { 

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

//do something 
} 

編輯:

Succesffuly實現了通過添加以下到春天的security.xml:

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

回答

7

我將創建一個自定義的註釋@LocalhostOnly和MVC攔截器,如果處理方法標註有@LocalhostOnly在這種情況下檢查,如果遠程IP地址從HttpServletRequest.getRemoteAddr()牽強確實本地主機,將檢查。

如果你使用的是spring安全,那麼,正如NimChimpsky所建議的那樣,可能會更好地插入遠程ip檢查。您可以定義一個自定義權限評估程序來檢查遠程IP地址。

您也可以使用servlet過濾器並在那裏執行localhost檢查以獲取特定URL(例如/someURL**)。最後,請注意,如果您在某個時間點將在逆向代理的後面運行應用程序,則所有請求都將看起來像是從本地主機到達的(即,如果逆向代理安裝在同一主機上)。在這種情況下,您需要從X-Forwarded-For標題中獲取IP地址。

編輯

春季安全實際上有IP檢查表達hasIpAddress('127.0.0.1')所以寧姆的回答可能是最好的一段路要走。

+0

你將如何實現「MVC攔截器,如果處理方法與@LocalhostOnly註釋,將檢查」? –

+0

您可以使用在攔截器的preHandle方法中作爲參數傳遞的處理程序Object來檢查它。看看這裏的答案類似的情況:http://stackoverflow.com/questions/22931074/spring-mvc-get-mapping-controller-method-from-interceptor/22960047#22960047 –

5

要限制你的整個訪問webserveryou可能使用

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

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

對於一個應用程序使用添加允許=「localhost」的上下文:

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

但對於特定的控制器的方法,你會使用彈簧安全是最好的。

0

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

步驟:

  • 寫一個傾聽者,讓在啓動時服務器端的主機名或IP,並將其存儲的地方,
  • 添加的ServletRequest作爲方法參數
  • 獲取客戶端主機名的方法:ServletRequest.getServerName(...)
  • 比較客戶端&服務器的IP地址或主機,
  • 如果地方,然後處理一下,
  • 如果不是本地的,則忽略它,需要給一些小費,
2

彈簧安全提供了可用於在@PreAuthorize註釋類型或方法可以這麼<intercept-url> 另一種可能是@PreAuthorize("hasIpAddress('127.0.0.1')")

0
@PreAuthorize("#request.getRemoteAddr().equals(#request.getLocalAddr())") 
相關問題