HttpServletRequest.getRemoteUser () против HttpServletRequest.getUserPrincipal (). GetName () - PullRequest
29 голосов
/ 30 декабря 2011

Кажется, что эти двое делают одно и то же. Кто-нибудь может объяснить главное различие между ними? Когда бы вы использовали один против другого?

HttpServletRequest.getRemoteUser ()

HttpServletRequest.getUserPrincipal (). GetName ()

Ответы [ 3 ]

40 голосов
/ 03 января 2012

A Principal представляет кого-то, кто может потенциально аутентифицироваться с вашим приложением. имя Принципала зависит от используемого метода аутентификации:

  • имя пользователя, например "fred" (в случае базовой аутентификации HTTP)
  • a Отличительное имя, такое как "CN = bob, O = myorg" (в случае клиентских сертификатов X.509 - в этом случае может быть возвращено X500Principal )

getRemoteUser() возвращает «логин пользователя», который, в случае HTTP Basic-аутентификации, также будет именем пользователя; однако он не отображается должным образом в случае клиентского сертификата X.509, поскольку пользователь не вводит «логин» как таковой - в приведенном выше примере мы могли бы использовать отличительное имя или просто CN, «bob».

Javadocs заявляет, что «то, будет ли имя пользователя отправлено с каждым последующим запросом, зависит от браузера и типа аутентификации», предполагая, что getRemoteUser() изначально предназначался для предоставления данных только для запросов, в которых имя пользователя было вошел . Это, однако, приведет к возвращению null для большинства запросов при использовании аутентификации на основе файлов cookie - не слишком полезно!

На самом деле getRemoteUser() часто просто звонит getUserPrincipal().getName(); проверено в Tomcat 6 и Jetty 6/7.

3 голосов
/ 30 декабря 2011

Метод getUserPrincipal() возвращает объект некоторого класса, производного от интерфейса Principal, который является абстракцией объекта, который является "пользователем", ответственным за запрос. Из него вы получаете реальный объект, который, в зависимости от реализующего класса, вы можете использовать для получения всевозможной информации об этом пользователе / ​​личности. Одним из этих свойств является строковое представление имени пользователя / удостоверения, которое вы получаете, вызывая getName().

getRemoteUser() на самом деле просто ярлык для получения этого строкового представления. У вас нет доступа к каким-либо другим методам, реализованным реализующим классом, и у вас нет доступа к самому объекту, только строковое представление имени.

В большинстве случаев, с которыми я знаком, это строковое представление - то, что вам нужно; Я полагаю , поэтому getRemoteUser() существует - это частый случай, поэтому есть простой / быстрый способ получить к нему доступ без фактической ссылки на реализующий объект класса.

1 голос
/ 09 февраля 2016

Немного связана проблема:

Людям, преобразующим старый код API IBM Portlet в JSR168, нужно было изменить PortletRequest на HttpServletRequest в некоторых параметрах метода, но затем из WPS6.1 и выше они не могут преобразовать это в PortletRequest (он больше не реализует соответствующий интерфейс) как кажется) и если они вызывают «getRemoteUser» непосредственно в запросе HttpServletRequest, они возвращаются к нулю (некоторые говорят, что обходной путь - включить параметр безопасности приложения в WAS [WebSphere Application Server]), другие говорят, что в сети требуется больше разметки, связанной с безопасностью. XML)

Обходным решением может быть использование PUMA, но, конечно, это специфично для IBM WebSphere. Вероятно, в других контейнерах портлетов есть другие обходные пути, специфичные для поставщика, если кто-то обнаружит, что getRemoteUser всегда возвращает null (судя по другим ответам, тогда getUserPrincipal (). GetName () также возвращает null, если getRemoteUser реализован как просто ярлык для этого).

Кстати, код PUMA, о котором я упоминал выше, находится здесь, так как немного трудно найти, что работает в 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");
    }
  }
...