Tomcat: обойти базовую аутентификацию для указанного IP-адреса - PullRequest
8 голосов
/ 03 октября 2011

Я настроил tomcat для базовой аутентификации. Я не хочу, чтобы кто-либо имел доступ к моему веб-приложению, но приложение обслуживает веб-службы. Поэтому я хочу обойти определенный IP-адрес из базовой аутентификации (этот IP не должен требовать аутентификации).

tomcat-users.xml:

<tomcat-users>
<user username="user" password="password" roles="user"/>
</tomcat-users>

web.xml:

<security-constraint>
<web-resource-collection>
  <web-resource-name>Entire Application</web-resource-name>
  <url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
  <role-name>user</role-name>
</auth-constraint>
</security-constraint>


<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>You must enter your login credentials to continue</realm-name>
</login-config>

<security-role>
   <description>
      The role that is required to log in to the Application
   </description>
   <role-name>user</role-name>
</security-role>

Спасибо, Четан.

1 Ответ

9 голосов
/ 03 октября 2011

Если вы хотите разрешить только несколько IP-адресов и запретить всем остальным, Фильтр для удаленного адреса - это то, что вам нужно.

Если вы хотите, чтобы клиенты с неизвестных IP-адресов видели основное диалоговое окно входа и могли войти в систему, вам нужен пользовательский Valve. Источник RemoteAddrValve (и его родительский класс RequestFilterValve является хорошей отправной точкой. Взгляните мой прежний ответ тоже .

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

import java.io.IOException;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.realm.GenericPrincipal;
import org.apache.catalina.valves.ValveBase;

public class AutoLoginValve extends ValveBase {

    private String trustedIpAddress;

    public AutoLoginValve() {
    }

    @Override
    public void invoke(final Request request, final Response response) 
             throws IOException, ServletException {
        final String remoteAddr = request.getRemoteAddr();
        final boolean isTrustedIp = remoteAddr.equals(trustedIpAddress);
        System.out.println("remoteAddr: " + remoteAddr + ", trusted ip: " 
                + trustedIpAddress + ", isTrustedIp: " + isTrustedIp);
        if (isTrustedIp) {
            final String username = "myTrusedUser";
            final String credentials = "credentials";
            final List<String> roles = new ArrayList<String>();
            roles.add("user");
            roles.add("admin");

            final Principal principal = new GenericPrincipal(username, 
                credentials, roles);
            request.setUserPrincipal(principal);
        }

        getNext().invoke(request, response);
    }

    public void setTrustedIpAddress(final String trustedIpAddress) {
        System.out.println("setTrusedIpAddress " + trustedIpAddress);
        this.trustedIpAddress = trustedIpAddress;
    }

}

И пример конфигурации для server.xml:

<Valve className="autologinvalve.AutoLoginValve" 
    trustedIpAddress="127.0.0.1" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...