Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Integracja systemów
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
DeyV
W końcu doszło do tego, że nie mogę już dużej odwlekać zabrania się za tą pracę, a że nie mam pomysłu na to, jak zrobić to "dobrze", stąd chciałbym usłyszeć Wasze opinie.

Zadanie polega na integracji bazy użytkowników w kilku zupełnie różnych systemach.
Jest to forum, wiki, eZ i jeszcze chyba mantis. (nie trudno się domyślać, na czyje potrzeby winksmiley.jpg )
Problem wydawałoby sie - banalny - w końcu chodzi tylko o to, by można się było raz zalogować, i być zalogowanym od razu we wszystkich tych systemach (działających na różnych subdomenach) oraz by wszędzie działały te same hasła i loginy.

Niestety - mimo że każdy z tych systemów jest napisany obiektowo - i każdy ma jakąś klasę typu User, zajmującą się tego typu zadaniami - to jednak sposób przechowywania tych informacji, a także ich obsługa - jest mocno zróżnicowana.
Dodatkowo - każdy z tych systemów przechowuje różne specyficzne dla siebie, ustawienia profilu.
Dodatkowo - jak już wcześniej zauważyłem - każdy z nich działą w innych subdomenach, co może (choć chyba nie musi) nieco utrudniać przenoszenie się identyfikatora sesji.

Jak można to rozwiązać?
1. przygotować osobny mechanizm, któy będzie zawierał wszystkie dane użytkownika, w którym użytkownik będzie się logował, przypominal sobie hasła, konfigurował wszystkie ustawienia itp.
Teraz jednak ciąg dalszy może wyglądać tak:
a ) nasz mechanizm podczas tworzenia nowego użytkownika tworzy odpowiednie konta we wszystkich systemach do niego podpiętych, podczas aktualizacji danych - aktualizuje je również w odpowiednich działach.
Natomiast poszczególne systemy mają albo wyłączone panele konfiguracyjne, albo panele, które podczas zapisywania niektórych danych - zapisują je również w naszym mechaniźmie.
- zamiast automatycznego tworzenia wszystkich profili, użytkownik, podczas pierwszego wejścia na np. forum może zostać poproszony o uzupełnienie niezbędnych danych.

b ) centralny mechanizm staje się jedynym miejscem przechowywania danych użytkownika, wszystkie pozostałe systemy mają całkowicie wyłączoną możliwość przechowywania i edycji tych ustawień. Przez cały czas muszą więc odwoływać się do centrali. W przypadku niektórych z nich - np. forum, wymagałoby to chyba bardzo dużych zmian.

2. rozbudować największy z istniejących mechanizmów - najprawdopodobniej forum, tak by pozwalało na konfiguracę również innych programów.
poziom trudności - spory.
Co więcej - traci się intuicyjność, bo skąd użytkownik ma wiedzieć, że aby zmienić ilość tematów wyświetlanych na wiki, musi wejść na forum?
Utrudnia to również logowanie do poszczególnych systemów, bo zawsze należy zaczynać od forum.

Czy są jeszcze jakieś inne rozwiązania?
Najlepiej takie, ktore by maksymalnie obniżyły konieczność ingerencji w poszczególne systemy (bo to, jak wiadomo - znacznie obniża możliwości ich aktualizacji...)
hwao
Powiecmy ze juz mamy w jakis sposob wszytkie te dane w 1 miescu (np tabela w forum).
Mozna by w kazdym z tych systemow "podiac" mechanizm ktory by symulowal pisanie danych przez uzytkownika (powiecmy ze user zalogowal sie na forum) i towrzy sie speclajne ciacho/sessja z loginem i haselm. Jezeli one (user wejdzie powiecmy na ez) jest to zalanczamy plik emuluje wyslanie tych danych przez forumlarz (a dalej system sobie juz radzi tak jakby one byly wpisane w formularzu)
anas
Hej.

Ja bym to rozwiazal piszac sterownik, ktory pobieral by odpowiednie dane od uzytkownika do przeprowadzenia autoryzacji(zapewne login i haslo) i wlasnie ten sterownik posredniczyl by(odpalal sie przed wybrana czescia witryny - wiki, forum itd) i preparowal odpowiednio dane do zalogowania dla odpowiednich czesci serwisu - wykrywajac gdzie sie aktualnie user znajduje. Przeprowadzalby autoryzacje - np. przekazujac dane do zalogowania jesli by takie mial w swojej sesji - jesli nie, przekazalby kontrole do modulu(forum, wiki itd). W tym przypadku trzeba bedzie jeszcze zaingerowac w kazdy modul autoryzacji w poszczegolnych czesciach(wiki, forum...) i dopisac kod ktory korzystal by z naszego sterownika i zapisywal w nim ze juz sa jakies dane do autoryzacji i zeby w razie czego przekazal je do innych czesci strony. Podobnie z wylogowaniem - jak w jakiejs czesci witryny user sie wyloguje powinna ta czesc poinformowac o tym sterownik i przeprowadzic ten sam proces dla pozostalych czesci.

Troche sie to wszystko wydaje pogmatwane ale nie wydaje mi sie zeby bylo skomplikowane do zrealizowania, chociaz moge sie mylic - jak cos jeszcze wpadnie mi do glowy to napewno napisze.

anas
hawk
Hmm, łatwo mogę powiedzieć, jak to powinno wyglądać w idealnym świecie, w którym autorzy forum, wiki, itd. myślą chociaż trochę o reuse...

Ustawienia użytkownika to jedno, uwierzytelnianie to drugie. Każdy system ma swoje ustawienia, i to jest jego wewnętrzna sprawa. Załóżmy że w każdym systemie jest klasa User. Generalnie odpowiedzialna będzie ona za 2 rzeczy:
- sprawdzenie, kim jest użytkownik
- wyciągnięcie jego indywidualnych ustawień
Chodzi o to, żeby rozdzielić te 2 rzeczy, a następnie podmienić pierwszy krok. W idealnym systemie nie byłoby problemu, bo baza danych nie byłaby "wbudowana" w klasę User.

Jeżeli jedno z drugim jest zrośnięte, to... źle. Można spróbować napisać coś dziedziczącego z klasy User, z przeciążoną metodą odpowiedzialną za uwierzytelnianie (jeżeli taka metoda w ogóle jest). Niestety, nową klasę User bardzo trudno jest wepchnąć do systemu w miejsce starej, bo mało kto słyszał o Dependency Injection sad.gif.

Nawet gdyby się udało, pozostaje problem zmiany hasła w profilu i konieczności podmiany kodu w tym miejscu.
----------------------
Przyszło mi też do głowy coś innego. A gdyby tak replikować (np. w cronie, raz na dobę) użytkowników na wszystkie, niezależne bazy? Przyjmując domyślne ustawienia takie, jakie tworzą się przy zakładaniu konta. W razie potrzeby można też zreplikować powtarzające się dane, w zależności od konkretnej bazy. Trochę chałupnicza metoda, ale...
Zamiast crona można też użyć np. triggerów w bazie danych - wtedy mamy real-time zamiast raz na dobę. Ale triggery działające na różnych bazach mogą przekraczać możliwości zastosowanego DBMS. No chyba że mamy Oracle - definiujemy łącze między bazami i po kłopocie winksmiley.jpg.
---------------------
Co do cookie - można teoretycznie wysłać cookie z wpisanym php.pl zamiast forum.php.pl i powinno się wysyłać wszędzie. Tyle mówi teoria.
wojto
Ja bym to widział tak jak anas, czyli stworzyc cos w rodzaju sterownika, ktory by pobieral z sesji głównej (zapisywane by tu były login i hasło użytkownika oraz wszystkie inne dane wymagane do zalogowania do wszystkich modułów (moduły mam na myśli forum, ez, wiki itp.)) i nastepnie w zaleznosci od miejsca jego wywolania wysylal by te dane do metody logowania juz w wybranym module.
Podczas rejestracji uzytkownik musialby wypelnic pola, ktore by byly sumą wszystkich przymusowych pol z kazdego modulu, pozniej user sie loguje do ktoregos z modulu, powiedzmy na forum, sterownik wywoluje metode z forum odpowiedzialna za logowanie, a jednoczesnie zapisuje dane login i haslo w tej glownej sesji. Nastepnie user chce wejsc na wiki, sterownik widzi, ze user usiluje tu wejsc i pobiera dane z glownej sesji i wysyla je do metody logowania w module wiki i analogicznie z ez i mantis.

Takie rozwiazanie wydaje mi sie byc proste w implementacji, gdyz wystarczy napisac ten sterownik (niezbyt trudne) oraz w kazdym module w logowaniu dodac metode dodawania danych do glownej sesji.
Oraz napisac wywolywanie metody sprawdzajacej z tego sterownika wykonywane na kazdej podstronie.
bela
Ja się wypowiem, bo dotyczy to mnie bezpośrednio smile.gif

Podczas integrowania Mantisa zrobiłem to tak jak hawk mówi, odzieliłem logowanie od reszty. W rezultacie z bazy forum pobiera login i hash a reszta ustawień nas nie obchodzi. Co do zmiany haseł etc to można podmienić linki na te do forum i modać mod do forum który sprawdza referera i przekierowuje ponownie do forum/mantisa etc.

DeyV, podczas integracji dokladnie o tym samym myślałem i wymyśliłem tylko:
  • Przenosimy dane z wszystkich systemów do jednej globalnej tablicy users
  • Z forum pobieramy tylko userid i hash, a reszte z odpowiednich baz
To byłoby chyba tyle smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.