Подтвердить что ты не робот

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

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

HttpServletRequest.getRemoteUser()

HttpServletRequest.getUserPrincipal(). getName()

4b9b3361

Ответ 1

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

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

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

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

В действительности, getRemoteUser() часто просто вызывает getUserPrincipal().getName(); проверены в Tomcat 6 и Jetty 6/7.

Ответ 2

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

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

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

Ответ 3

Проблема, связанная с битом:

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

Кажется, что на рабочем столе используется PUMA, но, разумеется, это специфичный для IBM WebSphere. Вероятно, в других контейнерах Portlet существуют другие рабочие параметры, зависящие от поставщика, если вы обнаружите, что getRemoteUser всегда возвращает null (судя по другим ответам then 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");
    }
  }