Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wysyłanie formularzy przed zalogowaniem, wymagane zalogowanie
Forum PHP.pl > Forum > PHP
sniver
Witam,

Planuję stworzyć mechanizm który zapewni mi działanie podobne jak na allegro.pl czy oferia.pl.
Dla przykładu gdy składam zamówienie na allegro albo ofertę na oferii, a nie jestem zalogowany, strona automatycznie przenosi mnie do formularza logowania. Po zalogowaniu ta konkretna rzecz jest dodawana (kup teraz lub wysłanie swojej oferty).
Chyba to dobrze opisałem.

Pytanie: Jak zrobić samodzielnie taki mechanizm?
Mój pomysł: wziąć ID sesji które jest wiadomo unikatowe dla każdej osoby, do niej przypisać URL i zaszyfrować obustronnie (tak by potem rozszyfrować gdzie ma wrócić i co zrobić). Dane wysłane do formularza wstawić do pliku albo bazy z tym unikatowym ID, a po powrocie na strone po zalogowaniu wykonać już automatycznie formularz tak by sie jakaś interakcja wykonała...

Troche pomieszałem....

Mój problem jest czysto merytoryczny i chodzi o pomoc, podpowiedź jak to według was powinno być zrobione.
Oczywiście jeśli ktoś zna gotowe rozwiązania tego typu będę wdzięczny za informacje

Pozdrawiam!
zonkerman
A może w GET'cie np zapisać nr aukcji i akcje jaką ma wykonać i po zalogowaniu przechwycić?
sniver
Pomysł jest taki:
1. Stworzenie identyfikatora akcji np. wysłanie komentarza. Identyfikator będzie zawierać zakodowaną informacje obustronnie:
a) URL z którego formularz był wywoływany
cool.gif URL do którego kieruje wysłany formularz
c) Aktualny czas (tak by odrzucać formularze które mają za stare winksmiley.jpg)
d) Identyfikator sesji,

I dla przykładu może to wyglądać np. tak: aHR0cDovL3d3dy5iZXRhLmVyb2JheS5wbC9wcm9kdWt0eS8xNDg0L1N1a2llbmthX05JR0hUX1F1ZWVu
X1BBU1NJT04uaHRtbA,,

2. Pola z formularza i wartości nadane przez użytkownika będą zapamiętane względem właśnie tego identyfikatora do np. pliku php o dźwięcznej nazwie: aHR0cDovL3d3dy5iZXRhLmVyb2JheS5wbC9wcm9kdWt0eS8xNDg0L1N1a2llbmthX05JR0hUX1F1ZWVu
X1BBU1NJT04uaHRtbA,,.php
ze zwykłymi wartościami w postaci array, czyli:

  1. <?php
  2.  
  3. $rePost = array(
  4. 'pole1' => 'wartosc tego pola wpisanego przez uzytkownika',
  5. 'pole2' => 'wartosc wpisana przez uzytkownika'
  6. 'jakiesInnePole' => 'blebleble'
  7. );
  8.  
  9. ?>


No i po zalogowaniu funkcja sprawdzi czy plik aHR0cDovL3d3dy5iZXRhLmVyb2JheS5wbC9wcm9kdWt0eS8xNDg0L1N1a2llbmthX05JR0hUX1F1ZWVu
X1BBU1NJT04uaHRtbA,,.php
istnieje czy też nie (wartość aHR0cDovL3d3dy5iZXRhLmVyb2JheS5wbC9wcm9kdWt0eS8xNDg0L1N1a2llbmthX05JR0hUX1F1ZWVu
X1BBU1NJT04uaHRtbA,, będzie podana w adresie i przekazana GET) i doda się albo sie nie doda coś co tam ma sie wykonać.

Dobre rozwiązanie?
zonkerman
A może zrobić tak:

1. Klikamy, aby coś zrobić np. kupić
2. Robimy przekierowanie na stronę z zakończeniem kupna
3. Sprawdzamy czy ktoś jest zalogowany:
TAK -> kontynuujemy dalsze operacje
NIE -> przechodzimy aby zalogować -> pkt 3

A jak to zrobić? Można np do sesji wsadzić id kupna (pkt 1) czy czegoś tam, bo zmienne $_SESSION siedzą cały czas do zzerowania i do zniszczenia sesji. Sprawdzić czy ktoś jest zalogowany (pkt 3) i podjąć odpowiednie środki. Zawsze możesz sprawdzić sesje + ciastka jako takie zabezpieczenie by nic nie zmieniać, a jak ktoś coś zmieni to wywali błąd.
sniver
wyposażyłem moje rozwiązanie w taki mechanizm. Dane zapisałem do sesji i jeśli ktoś jest niezalogowany przenosi na formularz logowania i nadaje dodatkowy zahaszowany parametr (czego oczy nie widzą to ludzie sie nie pytają o co chodzi winksmiley.jpg) o nazwie rePosting. No i proste warunki sprawdzają czy wróciło na odpowiednie miejsce i czy całość tyczy sie odpowiedniej podstrony i dodaje albo wywala z sesji wprowadzoną w tym przypadku opinię o produkcie...

Potem zapodam linka...
everth
Nie prościej tak?:
  1. Mamy id produktu, mamy akcję użytkownika (co chce zrobić z produktem), jego numer ip oraz id przeglądarki
  2. Sprawdzamy logowanie
  3. Jeśli użytkownik nie jest zalogowany to zapisujemy powyższe dane JSONem (robimy hasz (sha1) z IP oraz ID przeglądarki + jakaś sól) i wysyłamy mu w formie ciasteczka
  4. Ponownie sprawdzamy logowanie
  5. Jeśli zalogowany to sprawdzamy czy nie ma ciasteczka z zapisaną akcją, jeśli ma to sprawdzamy hasz i porównujemy - przechodzi to realizujemy akcje zapisane w ciasteczku, jak nie to ignorujemy ciasteczko

To wydaje mi się bardziej rozsądne od zapisywania danych w Sesji przed zalogowaniem.
sniver
bez znaczenia do czego to będzie zapisywane. Co jeśli np. zostaną otwarte 2 produkty i z obu zostaną wysłane opinie. W obu zostaną też wyświetlone pola do logowania...
Wtedy bez dobrze przemyślanego mechanizmu może się komentarz pojawić w złym miejscu...
everth
Niby jak? Możesz zapisać w ciastku HTTP_REFERER i w ten sposób ocenić z którym URL jest związane dane ciastko (nie do końca jestem pewny czy ciastko nie jest związane z konkretną kartą w przeglądarce, tak mi mówi intuicja, ale głowy nie dam). A jeśli akcja została wykonana to usuwamy ciacho i tyle. Dodatkowo możemy się zabezpieczyć jakimś mechanizmem sprawdzającym wpisy pod kątem duplikatów.
sniver
Ok gotowe!
Zapraszam do testów i ewentualnych uwag: Przykładowy komentarz

Założyłem testowego usera...
Login: test
Hasło: 123456


Ciacho jest przypisane do strony i przeglądarki - bez względu na to czy odpalisz ów stronę w jednej czy wielu kartach to i tak w każdej z nich będziesz mieć dostęp do tego ciasteczka...
everth
Jak ci działa - no problem. Po prostu rozwiązanie z ciachem wydaje mi się bardziej eleganckie - co do przywiązania to po masz hasz żeby ciacho zweryfikować (gdyby ktoś podłożył spreparowane)
muk4
BTW.
Validator HTML
86 Errors, 104 warning(s) tongue.gif Nie żebym się czepiał ale jak ktoś sprawdzi...


@DOWN
No, ale i tak liczba dosyć spora.
everth
Tak to bywa jak się nie stosuje do tworzenia HTMLa odpowiednich bibliotek (np. DOMDocument) smile.gif. Z tego co luknąłem to właściwie małe głupstwa (np. self-close tag).
sniver
walidacją sie jeszcze nie zajmowałem - póki co - więc sama strona jeszcze nie jest do oceny 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.