2011-12-30 9 views

Odpowiedz

37

A Principal przedstawia osobę, która może potencjalnie uwierzytelnić się przy użyciu aplikacji. Zleceniodawcy nazwa zależy od używanej metody uwierzytelniania:

  • nazwa użytkownika, takich jak „Fred” (w przypadku podstawowego uwierzytelniania HTTP)
  • nazwę wyróżniającą, takich jak „CN = bob, O = myorg "(w przypadku certyfikatów X.509 klienta - w takim przypadku może być zwracana X500Principal)

getRemoteUser() zwraca«login użytkownika», który w przypadku podstawowego uwierzytelniania HTTP, będzie również Nazwa Użytkownika; nie mapuje czysto w przypadku certyfikatu klienta X.509, ponieważ użytkownik nie wprowadza "logowania" jako takiego - w powyższym przykładzie moglibyśmy użyć nazwy wyróżniającej lub po prostu CN, "bob".

Stan Javadocs że „czy nazwa użytkownika jest wysyłana z każdym kolejnym wniosku zależy od przeglądarki i rodzaj uwierzytelniania”, sugerując, że getRemoteUser() pierwotnie miał dostarczyć dane tylko dla wniosków, w których nazwa została wpisana. Powoduje to jednak, że powraca ona do większości żądań, gdy uwierzytelnianie oparte na pliku cookie jest używane - niezbyt pomocne!

W rzeczywistości getRemoteUser() często po prostu wywołuje getUserPrincipal().getName(); zweryfikowane w Tomcat 6 i Jetty 6/7.

3

Sposób getUserPrincipal() zwraca przedmiot pewnej klasy pochodzący z interfejsu Principal, który jest poboru jednostki, która jest „użytkownik” odpowiedzialny żądania. Z niego otrzymasz rzeczywisty obiekt, który w zależności od klasy implementacji może posłużyć do uzyskania różnego rodzaju informacji o tym użytkowniku/tożsamości. Jedną z tych właściwości jest reprezentacja łańcuchowa nazwy użytkownika/tożsamości, którą uzyskuje się przez wywołanie getName().

getRemoteUser() to tak naprawdę skrót do uzyskania tej reprezentacji ciągów. Nie masz dostępu do żadnych innych metod zaimplementowanych przez klasę implementującą, nie masz dostępu do samego obiektu, tylko reprezentację łańcuchową nazwy.

Dla większości przypadków użycia, które znam, reprezentacja łańcuchów jest tym, czego potrzebujesz; I Wierzę, że istnieje powód, dla którego istnieje getRemoteUser() - jest to typowy przypadek, więc istnieje łatwy/szybki sposób na uzyskanie dostępu do niego bez otrzymania odnośnika do obiektu klasy wykonawczej.

+0

szukam więcej wglądu. Jaka jest semantyka obu ... jak się różnią. Czy dadzą ci dwa różne wyniki? Czy zawsze są takie same? – Dimitry

+1

+1 wydaje mi się to całkiem jasne. Chodzi mi o to, że zawsze możesz spojrzeć na kod, ale wyobrażam sobie, że jeden pochodzi z drugiego. –

+1

-1. ** getRemoteUser() ** może mieć wartość ** null **, gdy ** getUserPrincipal() ** nie jest ... Otrzymuję ten problem z * Spring MVC test framework *. ** getUserPrincipal(). GetName() ** jest właściwym rozwiązaniem! – gavenkoa

1

Nieco pokrewny problem:

Ludzie konwertazy starszą IBM Portlet kod API do JSR168 jednej musiał zmienić PortletRequest do HttpServletRequest w niektórych parametrów metody, ale potem z WPS6.1 i więcej, nie mogą tego przesłać do PortletRequest (nie implementuje on już odpowiedniego interfejsu, jak się wydaje) i jeśli wywołają "getRemoteUser" bezpośrednio w HttpServletRequest, zwracają wartość zerową (niektórzy twierdzą, że obejściem jest włączenie zabezpieczeń aplikacji opcja w WAS [WebSphere Application Server], inni twierdzą, że w web.xml potrzebny jest więcej znaczników związanych z bezpieczeństwem)

Wydaje się, że rozwiązaniem pośrednim jest PUMA, ale oczywiście jest to specyficzne dla IBM WebSphere. Prawdopodobnie w innych kontenerach portletów istnieją inne sposoby obchodzenia się z dostawcami, jeśli stwierdzisz, że getRemoteUser zawsze zwraca wartość null (sądząc po innych odpowiedziach, a następnie getUserPrincipal(). Funkcja getName() zwraca również wartość null, jeśli getRemoteUser jest zaimplementowany jako skrót do tego).

BTW, kod PUMA wspominam powyżej, jest tutaj, ponieważ jest to trochę trudne do znalezienia, co działa w 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"); 
    } 
    }