web-dev-qa-db-fra.com

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

Ces deux semblent faire les mêmes choses. Quelqu'un peut-il expliquer la principale différence entre les deux? Quand utiliseriez-vous l'un contre l'autre?

HttpServletRequest.getRemoteUser ()

HttpServletRequest.getUserPrincipal (). GetName ()

29
Dimitry

Un Principal représente quelqu'un qui pourrait potentiellement s'authentifier auprès de votre application. Le nom du principal dépend de la méthode d'authentification utilisée:

  • un nom d'utilisateur tel que "fred" (dans le cas de l'authentification HTTP Basic)
  • un nom distinctif tel que "CN = bob, O = myorg" (dans le cas des certificats clients X.509 - auquel cas un X500Principal peut être retourné)

getRemoteUser() renvoie "la connexion de l'utilisateur" qui, dans le cas de l'authentification HTTP Basic, sera également le nom d'utilisateur; cependant, il n'est pas correctement mappé dans le cas du certificat client X.509, puisque l'utilisateur n'entre pas de "login" en tant que tel - dans l'exemple ci-dessus, nous pourrions utiliser le nom distinctif ou simplement le CN, "bob".

Les Javadocs indiquent que "si le nom d'utilisateur est envoyé avec chaque demande ultérieure dépend du navigateur et du type d'authentification", ce qui suggère que getRemoteUser() était initialement destiné à fournir des données uniquement pour les demandes dans lesquelles un nom d'utilisateur a été saisi . Cependant, cela entraînerait le renvoi de null pour la majorité des demandes lorsque l'authentification basée sur les cookies est utilisée - pas trop utile!

En réalité, getRemoteUser() appelle souvent simplement getUserPrincipal().getName(); vérifié dans Tomcat 6 et Jetty 6/7.

40
SimonJ

La méthode getUserPrincipal() renvoie un objet d'une classe dérivée de l'interface Principal, qui est un abstraction de l'entité qui est "l'utilisateur" responsable de la demande . De là, vous obtenez un objet réel que, selon la classe d'implémentation, vous pouvez utiliser pour obtenir toutes sortes d'informations sur cet utilisateur/identité. L'une de ces propriétés est la représentation sous forme de chaîne du nom de l'utilisateur/identité, que vous obtenez en appelant getName().

getRemoteUser() n'est vraiment qu'un raccourci pour obtenir cette représentation de chaîne. Vous n'avez accès à aucune autre méthode implémentée par la classe d'implémentation, vous n'avez pas accès à l'objet lui-même, juste à la représentation sous forme de chaîne du nom.

Pour la plupart des cas d'utilisation que je connais, cette représentation de chaîne est ce que vous voulez; Je crois c'est pourquoi getRemoteUser() existe - c'est un cas courant donc il y a un moyen facile/rapide d'y accéder sans réellement obtenir une référence à un objet de classe d'implémentation.

3
user121356

Un problème un peu lié:

Les personnes qui convertissaient l'ancien code d'API IBM Portlet en JSR168 devaient changer PortletRequest en HttpServletRequest dans certains paramètres de méthode, mais à partir de WPS6.1 et plus, elles ne peuvent pas convertir cela en PortletRequest (il n'implémente plus l'interface respective comme il semble ) et s'ils appellent "getRemoteUser" directement sur HttpServletRequest, ils obtiennent un résultat nul (certains disent qu'une solution de contournement consiste à activer l'option de sécurité d'application dans WAS [WebSphere Application Server], d'autres disent que davantage de balisage lié à la sécurité est nécessaire dans web.xml)

Une solution de contournement semble être d'utiliser PUMA, mais bien sûr, c'est spécifique à IBM WebSphere. Probablement dans d'autres conteneurs de portlets, il existe d'autres solutions de contournement spécifiques au fournisseur si l'on constate que getRemoteUser renvoie toujours null (à en juger par les autres réponses, puis getUserPrincipal (). GetName () renvoie également null si getRemoteUser est implémenté comme un raccourci vers celui-ci).

BTW, le code PUMA que je mentionne ci-dessus est ici, car il est un peu difficile de trouver ce qui fonctionne dans 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");
    }
  }
1
George Birbilis