2012-01-19 6 views
12

Я настраиваю Solr на Jetty. Я хотел бы ограничить доступ только к нескольким IP-адресам. Не кажется очевидным, что это можно сделать с помощью Jetty. Возможно ли, и если да, то как?Ограничение IP-адресов для Jetty и Solr

+0

I думаю, что вы не можете напрямую, не создавая пользовательский обработчик или фильтр. В любом случае, вы можете поставить пристань за другим веб-сервером, например Apache. – Chewie

ответ

25

Solr 4.2.1 использует Jetty 8.1.8. Jetty 8 (как отмечено jonas789) не поддерживает .htaccess. Вместо этого он использует IPAccessHandler, который не имеет отличной документации. Мне пришлось немного поиграть, чтобы заставить его работать, поэтому я размещаю здесь обновленное решение.

IPAccessHandler управляет черным списком и белым списком, принимает произвольные диапазоны IP-адресов и поддерживает привязку определенных путей URI к каждой записи белого/черного списка. IPAccessHandler также подклассы HandlerWrapper, который оказывается важным.

Приложение solr по-прежнему работает в WebAppContext (как в решении Lyndsay), но теперь WebAppContext управляется ContextHandler, который находится в ContextHandlerCollection, занимающем слот первого обработчика на сервере. Чтобы остановить запросы от неправильного IP-адреса, чтобы попасть в приложение, нам нужно обернуть его внутри IPAccessHandler где-то по этому пути. IPAccessHandler ведет себя странно, если он находится в неправильном месте: я пробовал вставить его до обработчиков контекста, и он дал 403 Запрещено на неправильные машины, бросил NullPointerException истерики без каких-либо дополнительных сообщений об ошибках, всяческих глупостей. Я, наконец, получил его для работы путем упаковки самого ContextHandlerCollection на уровне сервера.

Перейдите на страницу etc/jetty.xml и прокрутите страницу до раздела обработчиков. Затем обернуть существующий элемент ContextHandlerCollection следующим образом:

<!-- =========================================================== --> 
<!-- Set handler Collection Structure       --> 
<!-- =========================================================== --> 
<Set name="handler"> 
    <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> 
    <Set name="handlers"> 
    <Array type="org.eclipse.jetty.server.Handler"> 
    <Item> 

    <!-- here begins the new stuff --> 
    <New class="org.eclipse.jetty.server.handler.IPAccessHandler"> 
     <Call name="addWhite"> 
     <Arg>xxx.xxx.xxx.xxx</Arg> 
     </Call> 
     <Set name="handler"> 
     <!-- here's where you put what was there before: --> 
     <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> 
     </Set> 
    </New> 
    <!-- here ends the new stuff --> 

    </Item> 
     <Item> 
     <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/> 
     </Item> 
     <Item> 
     <New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler"/> 
     </Item> 
    </Array> 
    </Set> 
    </New> 
</Set> 

Ресурсы:

+0

Я пробовал и он отлично работает! Он блокирует доступ к 'solr admin' &' 'клиенту', используемому с других хостов, чем тот, который вы использовали. – h4k1m

+0

Я самостоятельно прихожу к этому же решению; Я не нашел это первым. FYI эта вещь IPAccessHandler работает только с IPv4 - это ошибка/ограничение. Поэтому при запуске Java передайте: '-Djava.net.preferIPv4Stack = true'. И для тех, кто ищет предложенные правила, мои выглядят так: 127.0.0.1 -.-.- |/solr/techproducts/select Таким образом, localhost может делать что угодно, а все остальные строго ограничены определенным «core» и/выберите Solr RequestHandler. –

8

Я нашел решение.

Во-первых, извлеките содержимое файла solr.war в папке example/webapps. Затем создайте файл с именем .htaccess и поместите его в примерном/WebApps/папку Solr (тот, который вы только что извлеченный), содержащий следующие:

<Limit> 
    satisfy all 
    order deny,allow 
    deny from all 
    allow from xxx.xxx.xxx.xxx 
</Limit> 

В примере/и т.д./редактировать файл jetty.xml и комментарий out org.mortbay.jetty.deployer.WebAppDeployer. Затем, наконец, создать папку в примерах/называемых контекстов (если один еще не существует) и добавьте файл с именем solr.xml к нему, содержащее:

<Configure id="solr" class="org.mortbay.jetty.webapp.WebAppContext"> 
    <Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/webapps/solr</Set> 
    <Set name="contextPath">/solr</Set> 
    <Call name="setSecurityHandler"> 
     <Arg> 
      <New class="org.mortbay.jetty.security.HTAccessHandler"> 
       <Set name="protegee"> 
        <Ref id="solr"/> 
       </Set> 
      </New> 
     </Arg> 
    </Call> 
</Configure> 

Затем начать свой новый защищенный Solr!

+3

Для других это не будет работать в новых версиях Jetty, размещенных на eclipse. В основном больше нет HTAccessHandler. Ссылка: http://jetty.4.n6.nabble.com/jira-Created-JETTY-962-Clean-room-implementation-of-org-mortbay-jetty-securtiy-HTAccessHandler-td41205.html – jonas789

Смежные вопросы