2014-04-23 13 views
10

Tôi có một bộ điều khiển cụ thể (trong số nhiều bộ điều khiển khác). Tôi muốn cho phép các yêu cầu tới bộ điều khiển này chỉ được gọi từ máy chủ cục bộ. Whats cách tốt nhất để làm điều này là gì?Spring MVC - cho phép yêu cầu từ localhost chỉ đến bộ điều khiển cụ thể

đây là bộ điều khiển:

@Controller 
public class LocalProvider { 

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

//do something 
} 

EDIT:

Succesffuly đạt được điều đó bằng cách thêm dòng sau vào security.xml mùa xuân:

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

Trả lời

7

Tôi sẽ tạo chú thích tùy chỉnh @LocalhostOnly và trình chặn chặn MVC sẽ kiểm tra xem phương thức xử lý được chú thích với @LocalhostOnly và trong trường hợp đó, hãy kiểm tra xem địa chỉ ip từ xa được lấy từ HttpServletRequest.getRemoteAddr() có thực sự là localhost hay không.

Nếu bạn đang sử dụng bảo mật mùa xuân, như NimChimpsky đã đề xuất, có thể tốt hơn nên cắm kiểm tra ip từ xa vào đó. Bạn có thể xác định một bộ đánh giá quyền tùy chỉnh kiểm tra địa chỉ ip từ xa.

Bạn cũng có thể sử dụng bộ lọc servlet và kiểm tra máy chủ cục bộ tại đó để biết URL cụ thể (ví dụ: /someURL**).

Cuối cùng, lưu ý rằng nếu bạn sẽ chạy ứng dụng phía sau proxy ngược tại một thời điểm nào đó, tất cả các yêu cầu sẽ giống như chúng đến từ máy chủ cục bộ (nghĩa là, nếu proxy ngược được cài đặt tại cùng một máy chủ). Trong trường hợp đó, bạn cần phải nhận địa chỉ IP từ tiêu đề X-Forwarded-For.

EDIT

an ninh mùa xuân thực sự có ip kiểm tra biểu hiện hasIpAddress('127.0.0.1') nên câu trả lời của NimChimpsky có lẽ là cách tốt nhất để đi.

+0

cách bạn sẽ thực hiện "MVC đánh chặn mà sẽ kiểm tra xem phương pháp xử lý được chú thích với @LocalhostOnly"? –

+0

Bạn có thể kiểm tra nó bằng cách sử dụng trình xử lý Đối tượng được chuyển làm đối số trong phương thức preHandle của trình chặn. Hãy xem câu trả lời ở đây cho một kịch bản tương tự: http://stackoverflow.com/questions/22931074/spring-mvc-get-mapping-controller-method-from-interceptor/22960047#22960047 –

5

Để hạn chế quyền truy cập vào toàn bộ của bạn có thể webserveryou sử dụng

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

Trong máy chủ xml của tomcat (hoặc tương tự trong một máy chủ ứng dụng khác nhau).

Đối với một ứng dụng sử dụng thêm cho phép = "localhost" với bối cảnh:

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

Nhưng đối với các phương pháp điều khiển cụ thể, bạn sẽ là tốt nhất sử dụng bảo mật mùa xuân.

0

Đây là một giải pháp khả thi:

bước sau:

  • viết một người biết lắng nghe, có hostname phía máy chủ hoặc ip lúc khởi động, và lưu nó ở đâu đó,
  • thêm ServletRequest như một param của phương thức
  • bên trong phương thức lấy tên máy khách của khách hàng theo: ServletRequest.getServerName(...)
  • so sánh khách hàng & máy chủ của ip hoặc máy chủ,
  • nếu địa phương, sau đó xử lý nó,
  • nếu không địa phương, sau đó bỏ qua nó, tùy chọn đưa ra một số tip,
2

mùa xuân-an ninh cung cấp @PreAuthorize chú thích có thể được sử dụng trên gõ hoặc phương pháp để thay thế cho <intercept-url> có thể @PreAuthorize("hasIpAddress('127.0.0.1')")

0
@PreAuthorize("#request.getRemoteAddr().equals(#request.getLocalAddr())") 
Các vấn đề liên quan