2014-04-23 11 views
10

Ich habe einen bestimmten Controller (unter vielen anderen Controllern). Ich möchte Anfragen an diesen Controller erlauben, die nur von localhost aufgerufen werden. Was ist der beste Weg, dies zu tun?Spring MVC - Anfragen von Localhost nur zu bestimmten Controller

hier ist die Steuerung:

@Controller 
public class LocalProvider { 

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

//do something 
} 

EDIT:

Succesffuly erreicht, dass die folgenden Frühjahr security.xml durch Zugabe:

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

Antwort

7

würde ich eine benutzerdefinierte Anmerkung @LocalhostOnly und ein MVC-Interceptor erstellen, wenn Handler-Methode mit @LocalhostOnly und in diesem Fall prüfen, ob Remote-IP-Adresse abgerufen aus den HttpServletRequest.getRemoteAddr() tatsächlich localhost ist kommentiert überprüfen würde.

Wenn Sie Federsicherheit verwenden, dann, wie NimChimpsky vorgeschlagen hat, könnte es besser sein, Remote-IP-Check in das einstecken. Sie könnten einen benutzerdefinierten Berechtigungsauswerter definieren, der die Remote-IP-Adresse überprüft.

Sie können auch den Servlet-Filter verwenden und die Localhost-Prüfung für eine bestimmte URL durchführen (z. B. /someURL**).

Zuletzt, beachten Sie, dass, wenn Sie die Anwendung hinter einem Reverse-Proxy irgendwann ausführen werden, alle Anfragen aussehen wie sie von localhost angekommen sind (wenn Reverse-Proxy auf dem gleichen Host installiert ist). In diesem Fall müssen Sie die IP-Adresse von X-Forwarded-For Header abholen.

EDIT

Frühling Sicherheit hat tatsächlich ip Ausdruck Überprüfung hasIpAddress('127.0.0.1') so NimChimpsky Antwort ist wahrscheinlich der beste Weg zu gehen.Hier

+0

wie würden Sie „MVC-Abfangjäger, die prüfen würde, wenn Handler-Methode mit @LocalhostOnly kommentiert wird“ umzusetzen? –

+0

Sie können es mithilfe des Handler-Objekts überprüfen, das als Argument in der preHandle-Methode des Interceptors übergeben wird. Werfen Sie einen Blick auf die Antwort hier für ein ähnliches Szenario: http://StackOverflow.com/questions/22931074/spring-mvc-get-mapping-controller-method-from-interceptor/22960047#22960047 –

5

Um den Zugriff auf Ihre gesamte beschränken konnte webserveryou Verwenden Sie

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

In Server-XML von Tomcat (oder ähnlich in einem anderen App-Server).

Für eine App Add allow = "localhost" auf den Kontext:

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

Aber für spezielle Controller-Methoden, werden Sie am besten Frühjahr Sicherheit.

0

ist eine mögliche Lösung:

Schritte:

  • einen Zuhörer schreiben, die Server-Seite Hostname oder IP zu Startzeit bekommen, und speichern Sie es irgendwo,
  • hinzufügen ServletRequest als Parameter der Methode
  • innerhalb der Methode erhalten Sie den Client Hostname von: ServletRequest.getServerName(...)
  • vergleichen Client & Server-IP oder Host,
  • wenn lokale, dann umgehen,
  • wenn nicht lokal, dann ignorieren, gegebenenfalls etwas Tipp geben,
2

feder Sicherheit bietet @PreAuthorize Anmerkung, die verwendet werden kann, auf Typ oder Methode so eine Alternative zu <intercept-url> kann @PreAuthorize("hasIpAddress('127.0.0.1')")

0
@PreAuthorize("#request.getRemoteAddr().equals(#request.getLocalAddr())") 
Verwandte Themen