Mam wymaganie, w którym muszę zastąpić domyślne uwierzytelnianie użytkownika uwierzytelnieniem serwera centralnego, tj. Serwera SSO.
Debugując Drupala dowiedziałem się, że zarządzanie sesjami odbywa się w includes/session.inc
plikach. Chcę przeprowadzić uwierzytelnianie, jak pokazano na obrazku:
SCENARIUSZ: Zaloguj się
Szczegóły tych kroków to:
- Zastąp formularz logowania, aby podać nazwę użytkownika i hasło na serwerze SSO ( nie na Drupal , ale na .NET).
- Uwierzytelnij użytkownika na serwerze SSO przy użyciu bazy danych tej witryny; i odeślij odpowiedź na niestandardową stronę PHP mojej witryny (lub formularz przez moduł?).
- Korzystając z odpowiedzi, zidentyfikuj użytkownika w tabeli użytkowników i utwórz sesję dla tego użytkownika bez sprawdzania hasła (ponieważ oznaczałoby to podwójne uwierzytelnienie). Domyślnie Drupal ustawia plik cookie o nazwie
$insecure_session_name
zmiennej i wartości$sid
. Chcę, aby Drupal nie ustawiał tutaj pliku cookie, zamiast tego wysyłał wartości zmiennych do serwera SSO. - Serwer SSO pobierze wartości, utworzy plik cookie i upuści go w domenie głównej
domain.com
(aby to przypomniećmy website
isso server
znajduje się w subdomenie domeny głównej, która również nie znajduje się w Drupal). Następnie witryna Drupal może zalogować się przy użyciu tego pliku cookie.
Wiem, że to trudne pytanie, szukam tylko wskazówek, jak zacząć? jak mówią „nie należy rąbać rdzenia”. Tak więc moje pytania to:
- Gdzie powinienem znaleźć informacje na temat dogłębnego działania uwierzytelniania Drupal i zarządzania sesjami?
- Czy istnieje sposób, w jaki mógłbym wywoływać funkcje przy
includes/session.inc
użyciu haków (ponieważ komentarze do funkcji mówią „tylko do użytku wewnętrznego / nie do modyfikacji”)?
UWAGA: Będę używać tej samej metody do rejestracji użytkownika, aby rekord pozostał w centralnej bazie danych serwera SSO. I podczas tego wstawi jakieś śmieciowe hasło dla tego samego użytkownika w bazie danych strony Drupal (ponieważ hasło nie będzie sprawdzane podczas logowania).
Odpowiedzi:
Drupal obsługuje zewnętrzne uwierzytelnianie . Istnieje wiele alternatywnych modułów uwierzytelniania dla Drupal, takich jak OpenID (zawarte w rdzeniu), OAuth Connector lub LDAP . Dowiedz się więcej o tym, jak działa uwierzytelnianie Drupal; najlepiej byłoby spojrzeć na moduły OpenID i OAuth, a na podstawowy formularz logowania przesłać wywołanie zwrotne. Ale, AFAIK, zawsze zaczynają normalną sesję Drupal po udanym uwierzytelnieniu.
W celu zarządzania sesjami Drupal podłącza się do obsługi sesji PHP i rejestruje własne procedury obsługi. Samo zaplecze sesji Drupal można podłączyć, możesz ustawić
session_inc
zmienną na ścieżkę pliku, zapewniając alternatywne implementacje funkcji znalezionych wincludes/session.inc
. Memcache moduł wykorzystać do przechowywania sesji w memcached.W przypadku odniesień moduł OpenID obsługuje udane uwierzytelnianie, w
openid_authentication()
którym sam kończy działanie, i wywołuje moduł obsługi formularza logowania użytkownika (tj.user_login_submit()
). Sama procedura obsługi przesyłania jest prosta, ładuje pomyślnie uwierzytelnionego użytkownikauser_load()
do$user
zmiennej globalnej , a następnie wywołujeuser_login_finalize()
sesję obsługi, sygnaturę czasową logowania wuser
tabeli i wywołujehook_user_login()
implementacje.Inną opcją jest użycie
user_external_login_register()
funkcji. Funkcja zaloguje zewnętrznego użytkownika. W razie potrzeby tworzy także lokalnego użytkownika. Jeśli potrzebujesz więcej kontroli nad tworzeniem lokalnego użytkownika, zawsze można użyćuser_save()
,user_set_authmaps()
,user_login_submit()
iuser_external_load()
od was zwyczaj dzwonić, używającuser_external_login_register()
jako wzorca, co należy zrobić.źródło
user_authenticate () APi może się tu przydać.
EDYCJA: Gdy serwer SSO powróci z prawdziwym użyciem tego interfejsu API, aby zalogować się do użytkownika, który automatycznie zajmie się Twoimi sesjami. Myślę, że lepiej, jeśli użyjesz go
user_authenticate()
zamiast tworzyć sesje samodzielnie. Nie powinno to stanowić problemu nawet w przypadku podwójnego uwierzytelnienia, o ile zapewnione jest prawidłowe p-assowrd.Nie jestem pewien 4. Czy chcesz, aby plik cookie był widoczny w obu domenach? Jeśli tak, to w ustawieniach.php zainicjuj
$cookie_domain
domenę. Następnie pliki cookie w podstronie będą dostępne w witrynie nadrzędnej.źródło
user_authenticate
ponieważ uwierzytelnianie nie musi odbywać się na stronie Drupal. Mogę wygenerować sesję, dzwoniącdrupal_session_generate()
idrupal_session_regenerate()
z pliku session.inc. Masz rację co do wymagania dotyczącego plików cookie. Zobacz edycję.