2011-10-03 9 views
8

Ho configurato Tomcat per l'autenticazione di base. Non voglio che nessuno abbia accesso alla mia applicazione web ma l'app sta servendo servizi web. quindi voglio escludere uno specifico indirizzo IP da autenticazione di base (che IP non dovrebbe richiedere l'autenticazione.)Tomcat: esclusione dell'autenticazione di base per l'indirizzo IP specificato

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> 

Grazie, Chetan.

risposta

9

Se si desidera consentire solo pochi indirizzi IP e non consentire a tutti gli altri il Remote Address Filter Valve è quello che ti serve.

Se si desidera che i client da indirizzi IP sconosciuti visualizzino la finestra di dialogo di accesso di base e possano effettuare l'accesso, è necessario un codice personalizzato Valve. La fonte del RemoteAddrValve (ed è classe padre RequestFilterValve è un buon punto di partenza. Date un'occhiata my former answer too.

In ogni caso, qui di seguito è un codice di prova. Si mette un pieno Principal al Request se il cliente è venuta da un IP di fiducia in modo che il modulo di login non chiederà la password, altrimenti non tocca l'oggetto Request e l'utente può accedere come al solito

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

} 

e un esempio di configurazione per il server.xml:..

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

Grazie palacsinit, proverò ad aggiungere questo e pubblicheremo risultati presto. – Chetan

+1

Ha funzionato perfettamente, grazie mille palacsint. – Chetan

Problemi correlati