HttpServletRequest.getRemoteUser () vs HttpServletRequest.getUserPrincipal (). GetName ()

Estos dos parecen estar haciendo las mismas cosas. ¿Alguien puede explicar la principal diferencia entre los dos? ¿Cuándo usarías uno contra el otro?

HttpServletRequest.getRemoteUser ()

HttpServletRequest.getUserPrincipal (). GetName ()

Un Principal representa a alguien que podría autenticarse con su aplicación. El nombre del director depende del método de autenticación utilizado:

  • un nombre de usuario como “fred” (en el caso de autenticación HTTP básica)
  • un nombre distinguido como “CN = bob, O = myorg” (en el caso de los certificados de cliente X.509, en cuyo caso se puede devolver un X500Principal )

getRemoteUser() devuelve “el inicio de sesión del usuario” que, en el caso de la autenticación HTTP básica, también será el nombre de usuario; sin embargo, no se asigna de forma clara en el caso del certificado del cliente X.509, ya que el usuario no ingresa un “inicio de sesión” como tal; en el ejemplo anterior, podemos usar el nombre distinguido o simplemente el CN, “bob”.

Los Javadocs afirman que “si el nombre de usuario se envía con cada solicitud posterior depende del navegador y el tipo de autenticación”, lo que sugiere que getRemoteUser() originalmente estaba destinado a proporcionar datos solo para solicitudes en las que se ingresó un nombre de usuario . Sin embargo, esto daría como resultado que se devuelva null para la mayoría de las solicitudes cuando se usa autenticación basada en cookies, ¡no es muy útil!

En realidad, getRemoteUser() menudo solo llama a getUserPrincipal().getName() ; Verificado en Tomcat 6 y Jetty 6/7.

El método getUserPrincipal() devuelve un objeto de alguna clase derivada de la interfaz Principal , que es una abstracción de la entidad que es el “usuario” responsable de la solicitud. De él se obtiene un objeto real que, dependiendo de la clase de implementación, puede usar para obtener todo tipo de información sobre ese usuario / identidad. Una de esas propiedades es la representación de cadena del nombre del usuario / identidad, que obtiene al llamar a getName() .

getRemoteUser() es solo un acceso directo para obtener esa representación de cadena. No tiene acceso a ningún otro método implementado por la clase implementadora, no tiene acceso al objeto en sí, solo a la representación de cadena del nombre.

Para la mayoría de los casos de uso con los que estoy familiarizado, esa representación de cadena es lo que desea; Creo que esta es la razón getRemoteUser() cual getRemoteUser() existe: es un caso común, por lo que hay una forma fácil / rápida de acceder a él sin obtener una referencia a un objeto de clase implementadora.

Un problema relacionado con el bit:

Las personas que convirtieron el código API de IBM Portlet anterior a JSR168 tuvieron que cambiar PortletRequest a HttpServletRequest en algunos parámetros del método, pero luego desde WPS6.1 y hasta no pueden enviarlo a PortletRequest (no implementa la interfaz respectiva como parece y si llaman a “getRemoteUser” directamente en HttpServletRequest, vuelven a ser nulos (algunos dicen que una solución es habilitar la opción de seguridad de la aplicación en WAS [WebSphere Application Server], otros dicen que se necesita más marcado relacionado con la seguridad en web.xml)

Un entorno de trabajo parece ser usar PUMA, pero, por supuesto, eso es específico de IBM WebSphere. Probablemente en otros Portlet Containers hay otros entornos de trabajo específicos del proveedor si uno encuentra que getRemoteUser siempre devuelve nulo (a juzgar por otras respuestas, entonces getUserPrincipal (). GetName () también devuelve nulo si getRemoteUser se implementa solo como un atajo para eso).

Por cierto, el código PUMA que mencioné anteriormente está aquí, ya que es un poco difícil encontrar lo que funciona en WPS6.1 +:

 import com.ibm.portal.portlet.service.PortletServiceHome; import com.ibm.portal.um.*; import com.ibm.portal.um.exceptions.PumaException; import com.ibm.portal.puma.User; //... public String getCurrentUser(){ try { Context ctx = new InitialContext(); Name myjndiname = new CompositeName(PumaHome.JNDI_NAME); PumaHome myHome = (PumaHome) ctx.lookup(myjndiname); if (myHome!=null) { PumaProfile pumaProfile = myHome.getProfile(); com.ibm.portal.um.User user = (com.ibm.portal.um.User)pumaProfile.getCurrentUser(); List attributes = new ArrayList(); attributes.add("uid"); Map userAttributes = pumaProfile.getAttributes(user,attributes); return (String) userAttributes.get("uid"); } }