2011-10-03 9 views
8

He configurado tomcat para autenticación básica. No quiero que nadie tenga acceso a mi aplicación web, pero la aplicación está prestando servicios web. así que quiero pasar por alto una dirección IP específica de la autenticación básica (que la propiedad intelectual no debe requerir autenticación.)Tomcat: omite la autenticación básica para la dirección IP especificada

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> 

Gracias, Chetan.

Respuesta

9

Si desea permitir solo unas pocas direcciones IP y no permitir a todos los demás, el Remote Address Filter Valve es lo que necesita.

Si desea que los clientes de direcciones IP desconocidas vean el diálogo de inicio de sesión básico y puedan iniciar sesión, necesita un Valve personalizado. La fuente de la RemoteAddrValve (y es la clase padre RequestFilterValve es un buen punto de partida. Tome una mirada my former answer too.

De todos modos, a continuación es una prueba de concepto. Se pone una llena Principal a la Request si el cliente está viniendo una dirección IP de confianza para el módulo de inicio de sesión no pedirá la contraseña de otro modo que no toque el objeto Request y el usuario puede iniciar sesión como de costumbre

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; 
    } 

} 

y un ejemplo de configuración para el server.xml:..

<Valve className="autologinvalve.AutoLoginValve" 
    trustedIpAddress="127.0.0.1" /> 
+0

Gracias palacsinit, intentaré agregar esto y publicaré resultados pronto. – Chetan

+1

Funcionó perfectamente, muchas gracias palacsint. – Chetan

Cuestiones relacionadas