Jak utrzymać użytkownika zalogowanego na mojej stronie przez miesiące?

Używam OpenID. Jak sprawić, by użytkownik pozostawał zalogowany przez dłuższy czas nawet po zamknięciu okna przeglądarki?

Jak przechowywać i uzyskać dostęp do obiektu User użytkownika?

Zasadniczo, chyba nie bardzo rozumiem, jak działają sesje w Javie.

Author: BalusC, 2010-02-02

2 answers

Więc naprawdę chcesz opcję "Zapamiętaj mnie na tym komputerze"? Jest to w rzeczywistości niezwiązane z częścią OpenID. Oto sposób językowo-agnostyczny, jak możesz to zrobić:

  • Najpierw Utwórz tabelę DB z co najmniej kolumnami cookie_id i user_id. W razie potrzeby należy również dodać cookie_ttl i ip_lock. Nazwy kolumn mówią same za siebie.

  • Przy pierwszym logowaniu (jeśli to konieczne tylko z zaznaczoną opcją "Zapamiętaj mnie"), Wygeneruj długi, unikalny, trudny do odgadnięcia klucz (który jest w w żaden sposób powiązany z użytkownikiem), który reprezentuje cookie_id i przechowuje go w DB wraz z user_id. Zapisuje cookie_id jako wartość pliku cookie pliku cookie o znanej nazwie pliku cookie, np. remember. Daj ciastku długą żywotność, np. jeden rok.

  • Na każde żądanie sprawdź, czy użytkownik jest zalogowany. Jeśli nie, sprawdź wartość pliku cookie cookie_id powiązaną z nazwą pliku cookie remember. Jeżeli tam jest i jest poprawny zgodnie z DB, wtedy automatycznie loguje się do użytkownika związane z user_id i odłożyć wiek pliku cookie ponownie, a jeśli w ogóle, również {[2] } w DB.

W terminach Java / JSP / Servlet, użyj HttpServletResponse#addCookie() aby dodać plik cookie i HttpServletRequest#getCookies() aby dostać ciasteczka. Możesz zrobić wszystko za pierwszym razem w Filter, który nasłuchuje żądanych zasobów, np /* lub może trochę bardziej ograniczone.

Jeśli chodzi o sesje, nie potrzebujesz tego tutaj. Ma krótszą żywotność niż potrzebujesz. Użyj go tylko, aby umieścić zalogowany użytkownik lub "znaleziony" użytkownik, gdy ma ważny plik cookie remember. W ten sposób Filter może po prostu sprawdzić swoją obecność w sesji, a następnie nie trzeba sprawdzać plików cookie za każdym razem.

To w końcu dość prosto do przodu. Powodzenia.

Zobacz też:

 33
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:58

Cóż, pierwotnym powodem, dla którego wybrałem OpenID, było to, że ktoś inny mógł zająć się jak największą ilością implementacji i bezpieczeństwa uwierzytelniania dla mnie.

Po przyjrzeniu się openidowi, okazuje się, że istnieje coś, co nazywa się "natychmiastowe żądanie" ( http://openid.net/specs/openid-authentication-2_0.html#anchor28).

Składając wniosek o uwierzytelnienie, strona ufająca może zażądać, aby OP nie wchodził w interakcję z użytkownikiem końcowym. W takim przypadku OP musi odpowiedzieć natychmiast z potwierdzeniem, że uwierzytelnienie się powiodło, lub odpowiedzią wskazującą, że żądanie nie może zostać zrealizowane bez dalszej interakcji z użytkownikiem.

Z tego powodu myślę, że mógłbym po prostu zapisać w pliku cookie adres URL openID użytkownika i użyć natychmiastowego żądania, aby sprawdzić, czy użytkownik jest uwierzytelniony, czy nie. W ten sposób nie muszę nic robić z moją bazą danych ani implementować żadnej logiki zapobiegającej porwaniu sesji długotrwałego pliku cookie.

Ta metoda wydaje się, że jest to sposób, w jaki OpenID sugeruje, aby zrobić to za pomocą dokumentu ufając Party Best Practices.

 7
Author: Kyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-02 18:28:50