Ответ 1
Используйте org.apache.catalina.filters.RemoteAddrFilter и сопоставьте его с URL, который вы хотите защитить. Подробнее о настройках см. http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_Address_Filter.
Я хочу ограничить доступ к определенным URL-адресам в моем Tomcat webapp. Только 3 известных IP-адреса должны иметь доступ к URL-адресам, которые соответствуют определенному шаблону.
например. http://example.com:1234/abc/personId
Как я могу это достичь?
Используйте org.apache.catalina.filters.RemoteAddrFilter и сопоставьте его с URL, который вы хотите защитить. Подробнее о настройках см. http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_Address_Filter.
Вы можете сделать это с помощью этого в server.xml:
<Valve
className="org.apache.catalina.valves.RemoteAddrValve"
deny="117.40.83.*,122.224.95.*,119.255.28.*,218.8.245.*,218.85.139.*,219.117.197.*,124.89.39.*,58.18.172.*,180.153.225.*"
/>
(это настоящие IP-адреса: владельцы, вы знаете, почему: - |), но, как вы видите, это действительно блокиратор, а не средство защиты. Лучшим решением было бы поставить Apache HTTPD перед ним с помощью команд Deny All и Allow From, которые позволят вам разрешить только 3 IP-адреса, необходимые для доступа к службе.
Вы можете использовать что-то вроде этого, чтобы блокировать ips, и если вы находитесь за прокси-сервером:
<Context path="/manager" docBase="manager" reloadable="true" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteIpValve"/>
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="<your IP regex>"/>
</Context>
Я бы не ограничивал доступ по IP-адресу по следующим причинам:
x-forwarded-for
, будут иметь IP-адрес шлюзового устройства; полагая, что IP доверяет всем, кто находится за шлюзом, снова полагая, что вы захотите предоставить некоторым клиентам доступ.Вместо этого, если вам нужно запустить систему, где некоторые вызовы доступны только для определенных пользователей, я бы использовал аутентификацию - сертификаты на стороне клиента SSL работают достаточно хорошо для этой цели. В качестве альтернативы вы можете использовать что-то вроде OAuth.