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.
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
iuser_id
. W razie potrzeby należy również dodaćcookie_ttl
iip_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 zuser_id
. Zapisujecookie_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 cookieremember
. Jeżeli tam jest i jest poprawny zgodnie z DB, wtedy automatycznie loguje się do użytkownika związane zuser_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ż:
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.
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