2011-07-22 18 views
10

Chcę zalogować się do moich użytkowników automatycznie z naszej aplikacji. Wiem, że liferay ma funkcję automatycznego logowania, ale nie wiem, jak z niego korzystać. Nie znalazłem wiele wartościowych informacji w Internecie. Co muszę zrobić, aby autologowanie działało?Jak korzystać z autologin w liferay?

Chcę automatycznie zalogować się do użytkownika po kliknięciu linku, bez konieczności wpisywania imienia i hasła. Nazwa i hasło są zapisywane w naszej bazie danych aplikacji.

Odpowiedz

1

Co dokładnie masz na myśli przez "autologin"? Jeśli chcesz, aby Liferay sprawdzał, czy użytkownik jest już uwierzytelniony przez jakąś zewnętrzną jednostkę (jak serwer jednokrotnego logowania jako CAS), możesz to włączyć w portal.properties. Tam jest już wstępnie skonfigurowany dla wspieranych przez liferay mechanizmów uwierzytelniania. W przeciwnym razie może trzeba zaimplementować własną haka automatycznego logowania (jak wskazano w this post np

+0

Chcę, aby zalogować się użytkownikowi automatycznie kiedy kliknie link, bez niego konieczności podawania nazwy użytkownika i hasła . Nazwa i hasło są zapisywane w naszej bazie danych aplikacji. – Luke

+1

Chociaż nie wiem, dlaczego ktoś chciałby to zrobić: można sprawdzić przykładową aplikację LR, która ma ten mechanizm jako demonstrację ("zaloguj się jako Bruno" itp.). Poza tym, zdecydowanie zaleciłbym użycie czegoś takiego jak OpenID lub CAS, aby zminimalizować wysiłek logowania użytkowników, ale nadal utrzymywać pewien poziom bezpieczeństwa. – Dirk

+2

uzgodnione: Przejdź z dowolnym systemem pojedynczego logowania (np. CAS), aby użytkownicy uwierzytelniali się tylko raz (lub jeśli nalegasz, używaj NTLM) i ta tożsamość zostanie przekazana do aplikacji. Rozwiązania takie jak login Bruno mają być dla demo, a nie dla produkcji. Równie dobrze możesz dać anonimowemu użytkownikowi-gościowi więcej uprawnień, więc nie musisz się logować, jeśli rozważasz takie rozwiązanie. –

0

Dobrze znalazł Krok 1:. Kliknij przycisk Dodaj iframe i niech konfiguracja widok pop up Krok 2:. Podać adres URL, a jeśli istnieją dowolne zmienne, takie jak (www.mysite.com/Action=Login & Użytkownik ...), dodaj pole tekstowe Action = Login in hidden variables Krok 3: Kliknij uwierzytelnianie i wybierz uwierzytelnianie oparte na formularzu. zasugeruj, że nazwa pola użytkownika i nazwa pola hasła są podane poprawnie, a wartościami będą "@ ekran_nazwa @", "@ hasło @".

Załóżmy na przykład, że URL jest podobny do adresu www.mysite.com/Action = Login? User = aj & Hasło = aj. Nazwa użytkownika (pole) = user hasło (pole) = hasło Nazwa użytkownika (value) = aj hasła (wartość) = aj zmienne ukryte (pole) = action = login

Teraz, gdy wszelkie logi użytkowników do aplikacji liferay, jeśli jego konto istnieje w określonej witrynie (w adresie URL), automatycznie zaloguje się do tej witryny (działa jak pojedyncze logowanie).

To działa! -Aj

38

Uważam, że program operacyjny nie ma obecnie zastosowania. Niemniej jednak zasługuje na kompleksową odpowiedź. W rzeczywistości jestem zaskoczony, że jeszcze go nie ma.

Po pierwsze, jest to zły pomysł: taki układ, jak zaproponowany przez PO, jest naprawdę zbyt niepewny. Niemniej jednak rozwiązanie opisanego problemu może być dobrym prototypem dla kogoś, kto tworzy autologię dla Liferay.

Teraz powiedzmy, że chcesz automatycznie logować się do dowolnego użytkownika, którego nazwa jest wysyłana w parametrze ciągu zapytania. Na przykład, jeśli jeden dostęp to http://localhost:8080/web/guest/home?insecurely_login_user=juju, to należy zalogować się do Liferay użytkownika juju. Jak to zrobić? Wykonaj czynności opisane poniżej:

Tworzenie klasy automatycznego logowania

Po pierwsze, stworzenie wtyczki haka. W katalogu docroot/WEB-INF/src tworzy klasę implementującą interfejs com.liferay.portal.security.auth.AutoLogin. W moim przykładzie będę go nazywać br.brandizzi.adam.liferay.insecure.InsecureAutoLogin.

Interfejs AutoLogin ma tylko jeden sposób, zwany login(), który oczekuje dwa parametry (e HttpServletRequest i an HttpServletResponse wystąpienia) i zwraca szereg strun.Tak, moja klasa będzie wyglądać bez realizacji:

public class InsecureAutoLogin implements AutoLogin { 

    @Override 
    public String[] login(HttpServletRequest request, 
      HttpServletResponse response) throws AutoLoginException { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

Sposób AutoLogin.login() postara się odzyskać informacje niezbędne do uwierzytelnienia z wielu źródeł, głównie obiektu żądania. Jeśli zdecyduje, że użytkownik powinien być zalogowany, zwraca tablicę z odpowiednimi danymi do uwierzytelnienia; jeśli zdecyduje się na , nie zaloguj użytkownika, może po prostu zwrócić null.

W naszym przypadku staramy się uzyskać nazwę użytkownika z parametru insecurely_login_user z żądania. Jeśli jest taki parametr, będziemy kontynuować logowanie; jeśli nie ma takiego parametru, to po prostu zwraca null:

String screenName = request.getParameter("insecurely_login_user"); 
if (screenName == null || screenName.isEmpty()) { 
    return null; 
} 

Więc mamy pseudonim. Co zrobić teraz? Pozwól nam pobrać użytkownika z bazy danych o tej samej nazwie ekranowej.

long companyId = PortalUtil.getCompanyId(request); 
User user = UserLocalServiceUtil.getUserByScreenName(companyId, 
     screenName); 

Jeśli wich użytkownik taki pseudonim istnieje, zostanie ona pobrana i przypisana do zmiennej user. W takim przypadku uwierzytelnianie powinno zakończyć się sukcesem, a klasa autologin powinna zwrócić tablicę trzech ciągów znaków - poświadczeń. Są to wartości, które mają być zwrócone jako poświadczeń, w celu zamieszczenia ich w tablicy:

  • identyfikator użytkownika jako ciąg
  • hasło użytkownika, które mogą być szyfrowane, czy nie;
  • Wartość boolowska, rzutowana na ciąg, wskazująca, czy hasło jest zaszyfrowane.

Więc tutaj jest linia:

return new String[] { 
    String.valueOf(user.getUserId()), 
    user.getPassword(), 
    String.valueOf(user.isPasswordEncrypted()) 
}; 

Jeśli użytkownik nie znajduje jednak wyjątek zostanie rzucony. Tak więc, musimy otoczyć powyższy kod konstrukcją try/catch. Jeśli jest wyjątek, tylko wrócić null:

try { 
    long companyId = PortalUtil.getCompanyId(request); 
    User user = UserLocalServiceUtil.getUserByScreenName(companyId, 
      screenName); 
    return new String[] { String.valueOf(user.getUserId()), 
      user.getPassword(), 
      String.valueOf(user.isPasswordEncrypted()) }; 
} catch (Exception e) { 
    return null; 
} 

W końcu to moja InsecureAutoLogin klasa:

public class InsecureAutoLogin implements AutoLogin { 
    public String[] login(HttpServletRequest request, 
      HttpServletResponse response) throws AutoLoginException { 

     String screenName = request.getParameter("insecurely_login_user"); 
     if (screenName == null || screenName.isEmpty()) 
      return null; 

     try { 
      long companyId = PortalUtil.getCompanyId(request); 
      User user = UserLocalServiceUtil.getUserByScreenName(companyId, 
        screenName); 
      return new String[] { String.valueOf(user.getUserId()), 
        user.getPassword(), 
        String.valueOf(user.isPasswordEncrypted()) }; 
     } catch (Exception e) { 
      return null; 
     } 

    } 
} 

Rejestrowanie klasy automatycznego logowania

Teraz nasz hak powinien zarejestrować tę klasę jako procesor autologin. To naprawdę łatwe.

pierwsze, edytować plik docroot/WEB-INF/liferay-hook.xml dodanie elementu portal-properties z wartością portal.properties:

<?xml version="1.0"?> 
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_1_0.dtd"> 

<hook> 
    <portal-properties>portal.properties</portal-properties> 
</hook> 

Teraz utwórz plik o nazwie portal.properties na docroot/WEB-INF/src. Powinna ona zawierać właściwość o nazwie auto.login.hooks którego wartość powinna być nazwa naszej klasy:

auto.login.hooks=br.brandizzi.adam.liferay.insecure.InsecureAutoLogin 

I to jest to. Rozmieść ten hak i twój autologin będzie działał.

Wnioski

Jak już mówiłem, to nie powinien używać takiego niebezpiecznego „autoryzacja” metody. Zbyt łatwo jest go ominąć, uzyskując nawet uprawnienia administracyjne! Jeśli jednak wykonasz te kroki, masz szkielet, aby stworzyć lepszą funkcję autologin. Ponadto, wiem, że niektórzy ludzie chcą, abychcieli zrobić coś takiego jak ta niezabezpieczona metoda "uwierzytelniania" i czasami musimy zawiesić nasze sądy i pomóc strzelić sobie w nogi ...

Kod źródłowy tego projektu może można znaleźć here i można pobrać WAR here.

+1

+1 Ładnie wyjaśniony –

+0

Przyjemny samouczek, dziękuję :-) –

+0

Czy wiesz, że istnieje sposób na odzyskanie tablicy poświadczeń zwróconej przez metodę login() z portletu lub serwletu? thx – acvcu

2

Krok 1: Utwórz klasę CustomLoginFilter i narzędzia z interfejsu AutoLogin. Metoda logowania z zewnątrz. Kod w następujący sposób.

public String[] login(HttpServletRequest req, HttpServletResponse response)throws AutoLoginException { 

//Get the login parameter 

String loginEmailId = ParamUtil.getString(req, “_58_login”); 

String password = req.getParameter(“_58_password”); 

String[] credentials = new String[3]; 

credentials[0] = userId 

credentials[1] = loginEmailId; 

credentials[2] = password; 

//Write your business logic Here and return String[]. 

} 

Krok 2: Wpisz poniżej kod w portal-ext.properties

// you get full control from this custom class. 

auto.login.hooks=com.bolog.portal.login.security.CustomLoginFilter 

//Override Liferay Authentication pipeline 

auth.pipeline.enable.liferay.check=false 

auth.pipeline.pre=com.bolog.portal.login.security.CustomLoginAuthenticator 

Krok 3: Tworzenie klasy CustomLoginAuthenticator i wdraża od Authenticator.

Override authentication methods. 

public int authenticateByEmailAddress(long arg0, String arg1, String arg2, 

Map<String, String[]> arg3, Map<String, String[]> arg4) 

throws AuthException { 

//Write Your business login here and if authentication success then return 1 otherwise return 0; 

return 0; 

} 

public int authenticateByScreenName(long arg0, String arg1, String arg2, 

Map<String, String[]> arg3, Map<String, String[]> arg4) 
throws AuthException { 

//Write Your business login here and if authentication success then return 1 otherwise return 0; 
return 0; 
} 

public int authenticateByUserId(long arg0, long arg1, String arg2, 
Map<String, String[]> arg3, Map<String, String[]> arg4) 
throws AuthException { 

//Write Your business login here and if authentication success then return 1 otherwise return 0; 
return 0; 
} 

Krok 4: Jeśli uwierzytelnianie nie powiedzie wtedy można również przekierować każdą stronę przez następujący kod

if(Validator.isNull(credentials) || credentials[0]==null){ 

req.setAttribute(AutoLogin.AUTO_LOGIN_REDIRECT, “Your Login page path”); 

}