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())")