Централизованно защищайте все веб-приложения tomcat, используя базовую аутентификацию - PullRequest
7 голосов
/ 02 марта 2011

У меня есть сервер Tomcat 6, содержащий три веб-приложения: пользовательский, например, ROOT, Jenkins и Nexus.

Я бы хотел централизованно защитить все три (server.xml?) С помощью BASIC-аутентификации.

Как я могу добиться этого без изменения или настройки самих веб-приложений?

Ответы [ 4 ]

7 голосов
/ 15 марта 2011

Сначала я попытался (безуспешно) включить клапан BasicAuthenticator в conf / context.xml .Похоже, это не дало никакого эффекта.

Наконец-то я заработал (защитил все веб-приложения), добавив этот фрагмент в conf / web.xml :

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Basic Authentication</web-resource-name>
<!--Here wildcard entry defines authentication is needed for whole app -->
            <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>myrole</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

<security-role>
    <description>My role</description>
    <role-name>myrole</role-name>
</security-role>
6 голосов
/ 02 марта 2011

На ум приходят два способа:

  1. Вы можете изменить файл conf / context.xml, который включается всеми веб-приложениями, и вставить туда директивы аутентификации.Недостатком является то, что вы не можете исключить одно веб-приложение из проверки подлинности, насколько мне известно, и все веб-приложения будут иметь одинаковые требования к роли (хотя это звучит как то, что вам нужно)
  2. Вы можете реализовать защиту через apache иликакой-то другой веб-сервер, работающий перед Tomcat.Это имеет смысл, особенно если у вас уже есть.
2 голосов
/ 02 марта 2011

Это можно сделать, но вам нужно над этим поработать.

Для Tomcat в основном вам нужен Tomcat Valve . Это как Servlet Filter, но он специфичен для Tomcat.

Вы можете поместить Valve в запись HOST вашей конфигурации сервера, тогда все приложения на этом хосте должны будут пройти через этот клапан. И этот Valve - это то, что вам нужно для вашей базовой аутентификации.

Tomcat уже имеет базовый аутентификационный клапан, но он предназначен для работы с веб-приложением. Вероятно, вы можете взять этот источник и взломать его, чтобы он работал на уровне хоста, а не на уровне веб-приложений, таким образом защищая все ваши приложения без индивидуальной настройки.

Теперь, если бы вы были немного более непредубежденными, я бы предложил Tomcat Single Sign On , а затем расширил бы каждое из веб-приложений, чтобы использовать BASIC в их web.xml, следуя спецификации Servlet. Это в основном тривиальное изменение для отдельных приложений web.xml, но оно также решает проблему для вас. Но вы сказали, что не хотите модифицировать веб-приложения, поэтому вы застряли, используя специфические вещи Tomcat, и при этом «сами производите ручную работу».

1 голос
/ 29 мая 2013

Это возможно, но AFAIK невозможно без (некоторого) кода.Вот решение, которое никак не затрагивает развернутые веб-приложения , но также не дает никакой тонкой авторизации, только аутентификация.

Tomcat 7 (и 6?) Имеютизящная функция для выполнения аутентификации, даже если в веб-приложении нет защищенных ресурсов, называемых preemtiveAuthentication :

<Context preemptiveAuthentication="true">
  <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
</Context>

Вставьте это в ваш контекст, где бы он ни находился (возможно, вам нужно создать$CATALINA_BASE/conf/Catalina/localhost/mywebapp.xml для защиты mywebapp.war).

Это сделает любой входящий запрос с любым содержимым в заголовке авторизации для запуска авторизации.Любой запрос без заголовка авторизации будет по-прежнему проходить.

  • http://example.com:8080/mywebapp/ будет работать, в то время как GET /
  • http://user:password@example.com:8080/mywebapp/ не будет (илипроверит имя пользователя и пароль)

Таким образом, оставшийся трюк заключается в отключении этой «функции» каждый раз, даже для пользователей, которые не отправляют заголовок авторизации.Вот где мне пришлось вернуться к Valve.

Вот код для клапана, который устанавливает заголовок запроса «Авторизация» на «foo», если его нет.

import javax.servlet.ServletException;
import java.io.IOException;
import org.apache.catalina.valves.ValveBase;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;

public class ConditionallyAddFakeAuthorizationHeader extends ValveBase {
  public void invoke(Request request, Response response) throws IOException, ServletException {
    if (request.getCoyoteRequest().getMimeHeaders().getValue("authorization") == null) {
      request.getCoyoteRequest().getMimeHeaders().addValue("authorization").setString("foo");
    }
    getNext().invoke(request, response);
  }
}

Скомпилируйте файл, дайте ему хороший пакет, если хотите, и поместите его в общий путь к классам Tomcat, и добавьте изменения mywebapp.xml следующим образом (добавьте новый клапан перед базовым аутентификатором!):

<Context preemptiveAuthentication="true">
  <Valve className="ConditionallyAddFakeAuthorizationHeader"/>
  <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
</Context>

И, вуаля, ваш контекст не допустит никаких запросов через , если только он не аутентифицирован в определенной вами области.

...