2011-09-26 7 views
7

(6 Uso de Java y Tomcat 6.)conseguir un valor de HttpServletRequest.getRemoteUser() en Tomcat sin modificar la aplicación

¿Hay alguna manera para que consiga HttpServletRequest.getRemoteUser() para devolver un valor en mi entorno de desarrollo (es decir localhost) sin necesidad de modificar el archivo web.xml de mi aplicación?

La razón que pido es que la aplicación de autenticación cuando la aplicación se implementa en un entorno remoto es manejado por un servidor web y herramienta conectada. Ejecutando localmente obviamente no tengo la herramienta conectada o un servidor web separado; Solo tengo Tomcat 6. Estoy tratando de evitar agregar código a mi aplicación simplemente para apoyar el desarrollo en mi localhost.

Espero que haya una modificación que pueda hacer en los archivos context.xml o server.xml que me permitirán configurar el ID de usuario remoto o que intente sacarlo de un encabezado HTTP o algo así.

+0

¿Cómo comunicar su aplicación web con este plugin? – palacsint

+1

@palacsint La aplicación web no se comunica con el complemento; el servidor web lo cuida. La aplicación web simplemente solicita la instancia 'HttpServletRequest' para el usuario remoto. – Mark

Respuesta

7

Aquí es una prueba de concepto Valve ejecución, que lo hace:

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

} 

(probado con Tomcat 7.0.21.)

compilarlo, lo puso dentro de un frasco y copiar el frasco a la apache-tomcat-7.0.21/lib carpeta. Es necesario modificar el server.xml:

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

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

supongo que trabaja dentro de los contenedores y EngineContext también.

Más información:

+0

Gracias por toda la información! Creé una clase como la que describes, JAR la subió y actualizó el archivo 'server.xml'. Tenía que hacer un cambio porque estoy corriendo Tomcat v6.0.20: la firma 'GenericPrincipal' requiere un reino por lo que añade' última ámbito Realm = request.getContext() getRealm(); '.. Sin embargo, no parece estar teniendo un efecto. Intenté actualizar el archivo 'context.xml' también, pero nuevamente no produjo ningún resultado. El principal y el ID de usuario de la solicitud son 'nulos' cuando llegan al código de mi aplicación. ¿Quizás hiciste algo más? – Mark

+1

Acabo de pasar 'null' como el reino, y funciona para mí con Tomcat 6.0.20. (Consulte mis modificaciones en la respuesta.) ¿Hay alguna excepción en sus registros? – palacsint

+1

Muchas gracias por la ayuda con todo esto. Resulta que tuve su válvula implementada correctamente todo el tiempo. La razón por la que no funcionó fue porque no conocía la importancia de establecer la propiedad JVM 'catalina.base' en el inicio del servidor. Una vez que modifiqué 'server.xml' en esa ubicación, todo funcionó perfectamente. ¡Gracias de nuevo! – Mark

1

Utilice un ámbito local, basado en archivos para la prueba. Verifique su conf/tomcat-users.xml y cree roles y usuarios para su aplicación y habilite las restricciones de seguridad en su web.xml. Hay buenos ejemplos en el tomcat-users.xml.

+1

Sí, he notado el archivo 'Tomcat-users.xml' y saber acerca de la adición de restricciones de seguridad dentro de web.xml de mi aplicación, pero estoy preguntando si hay una manera de lograr algo parecido _without_ modificación real/verdadero/destino-para -Codigo de producción; Me encantaría modificar solo la configuración de mi servidor local. – Mark

+0

Hola, palacsint ¿Podría mostrar más detalles sobre el usuario remoto desplegado a través del archivo xml ... Gracias! – Edward

+0

@Edward: Lo siento, no tengo tiempo ahora para obtener una respuesta completa. Supongo que deberías preguntarlo como una nueva pregunta. Envíenme un enlace y verifico el fin de semana si nadie lo contesta. – palacsint

Cuestiones relacionadas