2011-12-30 4 views

Respuesta

37

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

  • un nombre de usuario tal como "Fred" (en el caso de autenticación básica HTTP)
  • un nombre completo tal 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 básica HTTP, también será la nombre de usuario; sin embargo, no se correlaciona limpiamente en el caso del certificado de cliente X.509, ya que el usuario no ingresa un "inicio de sesión" como tal; en el ejemplo anterior, podríamos usar el Nombre completo o simplemente el CN, "bob".

El estado Javadocs 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() estaba destinado originalmente para proporcionar datos sólo para las solicitudes en las que se ha introducido un nombre de usuario. Sin embargo, esto daría como resultado que devuelva null para la mayoría de las solicitudes cuando la autenticación basada en cookies está en uso, ¡pero no es demasiado útil!

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

3

El método getUserPrincipal() devuelve un objeto de algunos clase derivada de la interfaz Principal, que es un abstracción de la entidad que es el "usuario" responsable de la solicitud. A partir de él, obtiene un objeto real que, dependiendo de la clase implementadora, puede usar para obtener todo tipo de información sobre ese usuario/identidad. Una de esas propiedades es la representación en cadena del nombre del usuario/identidad, que obtiene llamando al getName().

getRemoteUser() es en realidad un atajo 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 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; I crea existe la razón por la cual getRemoteUser() existe, es un caso común, por lo que hay una manera fácil/rápida de obtener acceso sin obtener realmente una referencia a un objeto de clase de implementación.

+0

Busco a una visión más clara. ¿Cuál es la semántica de ambos ... cómo son diferentes? ¿Te darán cada uno dos resultados diferentes? ¿Son siempre lo mismo? – Dimitry

+1

+1 esto me parece bastante claro. Quiero decir que siempre puedes mirar el código, pero imagino que uno se deriva del otro. –

+1

-1. ** getRemoteUser() ** puede ser ** nulo ** cuando ** getUserPrincipal() ** no es ... Recibo este problema con * Spring MVC test framework *. ¡** getUserPrincipal(). GetName() ** es lo correcto para usar! – gavenkoa

1

Un tema relacionado bits:

Las personas mayores de conversión de código API de IBM portlets JSR 168 a uno tuvo que cambiar a PortletRequest HttpServletRequest en algunos parámetros del método, pero luego de WPS6.1 y más, no pueden convertirlo en PortletRequest (ya que no implementa la interfaz respectiva como parece) y si llaman "getRemoteUser" directamente en HttpServletRequest devuelven nulo (algunos dicen que un workarround es para habilitar la seguridad de la aplicación) opción en WAS [WebSphere Application Server], otros dicen que se necesita un marcado más relacionado con la seguridad en web.xml)

Parece que usar PUMA es utilizar PUMA, pero, por supuesto, eso es específico de IBM WebSphere. Probablemente en otros Contenedores de portlets haya otros workarrounds específicos del proveedor si uno encuentra que getRemoteUser siempre devuelve null (a juzgar por otras respuestas, entonces getUserPrincipal(). GetName() también devuelve null si getRemoteUser se implementa como un acceso directo a ese).

Por cierto, el código PUMA menciono anteriormente es aquí, ya que es un poco difícil de 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"); 
    } 
    } 
Cuestiones relacionadas