2011-09-26 3 views
7

(Utilizzo di Java 6 e Tomcat 6.)Ottenere un valore da HttpServletRequest.getRemoteUser() in Tomcat senza modificare l'applicazione

Esiste un modo per me di ottenere HttpServletRequest.getRemoteUser() per restituire un valore nel mio ambiente di sviluppo (ad esempio localhost) senza dover modificare il file web.xml della mia applicazione?

La ragione per cui chiedo è che l'implementazione dell'autenticazione quando l'app viene distribuita in un ambiente remoto viene gestita da un server Web e da uno strumento plug-in. Esecuzione locale Ovviamente non ho lo strumento plug-in o un server web separato; Ho solo Tomcat 6. Sto cercando di evitare di aggiungere codice alla mia applicazione semplicemente per supportare lo sviluppo sul mio localhost.

Spero ci sia una modifica che posso apportare ai file context.xml o server.xml che mi permetteranno di impostare l'ID utente remoto o che proverò a estrarlo da un'intestazione HTTP o qualcosa del genere.

+0

Come il vostro webapp comunicare con questo plugin? – palacsint

+1

@palacsint L'app Web non comunica con il plug-in; il web server lo segue. L'app Web richiede solo l'istanza 'HttpServletRequest' per l'utente remoto. – Mark

risposta

7

Ecco un prototipo Valve attuazione cui fa:

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 RemoteUserValve extends ValveBase { 

    public RemoteUserValve() { 
    } 

    @Override 
    public void invoke(final Request request, final Response response) 
      throws IOException, ServletException { 
     final String username = "myUser"; 
     final String credentials = "credentials"; 
     final List<String> roles = new ArrayList<String>(); 

      // Tomcat 7 version 
     final Principal principal = new GenericPrincipal(username, 
          credentials, roles); 
      // Tomcat 6 version: 
      // final Principal principal = new GenericPrincipal(null, 
      //    username, credentials, roles); 


     request.setUserPrincipal(principal); 

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

} 

(testato con Tomcat 7.0.21.)

compila, metterlo in un barattolo e copiare il vaso al Cartella apache-tomcat-7.0.21/lib. È necessario modificare il server.xml:

<Host name="localhost" appBase="webapps" 
    unpackWARs="true" autoDeploy="true"> 

    <Valve className="remoteuservalve.RemoteUserValve" /> 
... 

Suppongo che lavora all'interno dei contenitori Engine e Context troppo.

Maggiori informazioni:

+0

Grazie per tutte le informazioni! Ho creato una classe come la descrivi, JAR e aggiorna il file 'server.xml'. Ho dovuto apportare una modifica perché sto eseguendo Tomcat v6.0.20: la firma 'GenericPrincipal' richiede un reame quindi ho aggiunto' Realm realm finale = request.getContext(). GetRealm(); '. Tuttavia, non sembra avere un effetto. Ho provato ad aggiornare anche il file 'context.xml', ma ancora non ha prodotto alcun risultato. L'ID principale e dell'utente della richiesta sono entrambi nulli quando raggiungono il mio codice applicazione. Hai fatto forse qualcos'altro? – Mark

+1

Ho appena passato 'null' come realm e funziona con Tomcat 6.0.20. (Vedi le mie modifiche nella risposta.) Ci sono delle eccezioni nei log? – palacsint

+1

Grazie mille per l'aiuto in tutto questo. Risulta che ho implementato la valvola correttamente per tutto il tempo. Il motivo per cui non ha funzionato è stato perché non ero esperto del significato di impostare la proprietà JVM di catalina.base all'avvio del server. Una volta modificato il 'server.xml' in quella posizione, tutto ha funzionato perfettamente. Grazie ancora! – Mark

1

Utilizzare un dominio locale basato su file per il test. Controlla il tuo conf/tomcat-users.xml e crea ruoli e utenti per la tua applicazione e abilita i vincoli di sicurezza nel tuo web.xml. Ci sono buoni esempi nel tomcat-users.xml.

+1

Sì, ho notato il file 'tomcat-users.xml' e so di aggiungere vincoli di sicurezza all'interno del web.xml della mia app, ma sto chiedendo se c'è un modo per ottenere qualcosa di simile _ senza modificare di reale/reale/destinato-per -produzione codice; Sarei più felice nel modificare la configurazione del mio server locale. – Mark

+0

Salve, palacsint Puoi mostrare maggiori dettagli di distribuzione dell'utente remoto tramite file xml ... Grazie! – Edward

+0

@ Edward: Mi dispiace, non ho tempo ora per una risposta completa. Immagino che dovresti chiederlo come una nuova domanda. Lasciami un link e controllerò il fine settimana se nessuno risponderà. – palacsint