Czy istnieje sposób na połączenie zachowania wygasania sesji przy zamknięciu przeglądarki i wieku cookie sesji

Ze względów bezpieczeństwa ustawiłem SESSION_EXPIRE_AT_BROWSER_CLOSE na true.

Ale Pliki cookie o długości przeglądarki (pliki cookie, które wygasają, gdy użytkownik zamknie przeglądarkę) nie wygasają, wtedy SESSION_COOKIE_AGE nie ma żadnych efektów (tak, sprawdzam). Ale chcę ustawić wylogowanie / timeout na nieaktywności plus wylogować się przy zamykaniu przeglądania.

Moje pytanie brzmi: jak najlepiej wdrożyć limit czasu braku aktywności/wylogowania w plikach cookie o długości przeglądarki scenariusz?

Author: dani herrera, 2012-02-14

1 answers

Jak wyjaśniasz, SESSION_EXPIRE_AT_BROWSER_CLOSE i SESSION_COOKIE_AGE nie są kompatybilne. Gdy ustawisz datę wygaśnięcia na plik cookie, ten plik cookie nie staje się plikiem cookie o długości przeglądarki.

Następnie, aby osiągnąć pożądane zachowanie, należy ustawić SESSION_EXPIRE_AT_BROWSER_CLOSE jako True i kontrolować limit czasu wygaśnięcia ręcznie.

Eleganckim sposobem na ręczne kontrolowanie limitu czasu to:

  1. Utwórz nową custom middleware, która kontroluje przerwa.
  2. Modyfikuj settings.py aby włączyć własne oprogramowanie pośrednie (i sesje).

Timeout custom middleware może wyglądać następująco:

class timeOutMiddleware(object):

    def process_request(self, request):
        if request.user.is_authenticated():
            if 'lastRequest' in request.session:            
                elapsedTime = datetime.datetime.now() - \
                              request.session['lastRequest']
                if elapsedTime.seconds > 15*60:
                    del request.session['lastRequest'] 
                    logout(request)

            request.session['lastRequest'] = datetime.datetime.now()
        else:
            if 'lastRequest' in request.session:
                del request.session['lastRequest'] 

        return None

Zapamiętaj włącz sesje w celu przechowywania lastRequest.

To rozwiązanie jest napisane i przetestowane be me I teraz działa na mojej stronie. Ten kod ma licencję GNU;)

Nowość na django 1.6 (... dwa lata później ... )

Wartości Datetime i timedelta można serializować tylko wtedy, gdy za pomocą ogórków kiszonych (PickleSerializer) ([13]). Jeśli nie, być może łatwym rozwiązaniem jest translate datetime to unix timestamp and back . Be free to post below this translation.

Edytowane

Aplikacja Django-session-security dostarcza mechanizm do wylogowania nieaktywnych uwierzytelnionych użytkowników. Spójrz.

 17
Author: dani herrera,
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 12:17:26