Spring MVC - разрешение запросов от localhost только к определенному контроллеру

У меня есть определенный контроллер (среди многих других контроллеров). Я хотел бы разрешить запросы к этому контроллеру, которые вызываются только с localhost. Каков наилучший способ сделать это?

здесь находится контроллер:

@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')" />

Ответ 1

Я бы создал пользовательскую аннотацию @LocalhostOnly и перехватчик MVC, который бы проверял, если метод обработчика аннотируется с помощью @LocalhostOnly, и в этом случае проверьте, действительно ли удаленный IP-адрес из HttpServletRequest.getRemoteAddr() действительно является локальным.

Если вы используете spring безопасность, то, как предложил NimChimpsky, может быть лучше подключить удаленную проверку ip в этом. Вы можете определить настраиваемый специалист по оценке, который проверяет удаленный IP-адрес.

Вы также можете использовать фильтр сервлета и проверить локальный хост там для определенного URL (например, /someURL**).

Наконец, имейте в виду, что если вы в какой-то момент будете запускать приложение за обратным прокси-сервером, все запросы будут выглядеть так, как будто они были получены с localhost (то есть, если обратный прокси установлен на том же хосте). В этом случае вам нужно будет забрать ip-адрес из заголовка X-Forwarded-For.

ИЗМЕНИТЬ

Spring На самом деле безопасность на самом деле имеет ip-проверку выражения hasIpAddress('127.0.0.1'), поэтому ответ NimChimpsky, вероятно, лучший способ пойти.

Ответ 2

Чтобы ограничить доступ ко всему веб-сайту, вы можете использовать

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

В сервере xml tomcat (или аналогичном на другом сервере приложений).

Для одного приложения, используйте add allow = "localhost" в контексте:

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

Но для конкретных методов контроллера лучше всего использовать spring безопасность.

Ответ 3

spring -security предоставляет аннотацию @PreAuthorize, которая может использоваться по типу или методу, поэтому альтернатива <intercept-url> может быть @PreAuthorize("hasIpAddress('127.0.0.1')")

Ответ 4

Вот возможное решение:

действия:

  • напишите прослушиватель, получите имя хоста на стороне сервера или ip во время запуска и сохраните его где-нибудь,
  • добавить ServletRequest в качестве параметра метода
  • внутри метода получить имя хоста клиента: ServletRequest.getServerName(...)
  • сравнить клиент и сервер ip или хост,
  • если локально, а затем обработайте его,
  • если не локальный, а затем игнорировать его, необязательно давать подсказку,

Ответ 5

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