7
votes

Persister les variables de session sur la connexion

Je souhaite conserver des informations sur les préférences d'utilisateurs dans une variable de session. Si l'utilisateur choisit une préférence lorsqu'il est déconnecté, puis se connecte ultérieurement, je souhaite que la préférence soit maintenue sans avoir à resélectionner.

Les sessions Django conservent une clé de session dans un cookie pour suivre une session d'utilisateurs. La façon dont je comprends bien, cette clé est modifiée lorsqu'un utilisateur se connecte.

a) Cela signifie-t-il que toutes les variables de session sont supprimées sur la connexion ou y a-t-il une sorte de PASSOVER

B) dans le cas de ne pas pouvoir enregistrer des préférences dans une connexion, définit manuellement des cookies la meilleure façon de procéder? J'imagine un scénario comme:

  • Bien que déconnecté, maintenez des préférences dans Cookie
  • sur la connexion, copiez les préférences à la variable de session et à écrire à dB (via SIGNAL?)
  • sur la déconnexion, mettez à jour les cookies avec des préférences (via SIGNAL?)

    mise à jour

    J'ai réussi à obtenir cette fonctionnalité en enregistrant des préférences dans l'objet de profil de l'utilisateur, ainsi que dans un cookie (ces préférences ne sont en aucun cas sensibles). Lorsque l'utilisateur est connecté, leur paramètre de profil prend la préférence. Lorsqu'il n'est pas connecté, la préférence de la cookie est choisie


0 commentaires

5 Réponses :


3
votes

Lorsque vous vous connectez / déconnecté Django affleurera toutes les sessions si un autre utilisateur se connecte (demande.session.flush () dans auth / init .PY).

Vous préférez stocker les paramètres utilisateur dans la base de données et ajouter du middleware pour obtenir ces données et le stocker dans votre demande.


0 commentaires

2
votes

Les données utilisateur qui persistent comme il faut vivre dans quelque chose comme un userprofile modèle


3 commentaires

Il sera écrit sur la base de données une fois que l'utilisateur se connecte, mais si l'utilisateur n'est pas connecté, j'aimerais toujours qu'ils puissent définir des préférences et une fois qu'ils finissent par se connecter, ces préférences seraient écrites à la UserProfile modèle pour que le problème maintient les données sur une connexion


Mais vous ne pouvez pas savoir si c'est la même personne ou simplement un autre utilisateur du même navigateur. Vous êtes donc heureux de supposer que c'est la même personne?


Pour les paramètres d'affichage simples Oui, mais les paramètres Les objets DB peuvent être marqués comme autorisé de sorte que seuls certains paramètres soient écrits dans un cookie pendant que tous sont écrits dans une session connectée.



0
votes

Je pense vraiment que votre conception initiale a eu du sens. Si vous souhaitez enregistrer des variables de session sur la limite de connexion / déconnexion, vous pouvez faire quelque chose comme ceci.

from django.contrib.auth import views

@persist_session_vars(['HTTP_REFERER'])
def login(request, *args, **kwargs):
    return views.login(request, *args, **kwargs)


2 commentaires

C'est un bon début, mais n'est pas thread-coffre-fort! Depuis le persist_session_vars est instancié une fois, tous les utilisateurs écrivent sur le même session_backup dict (même en faisant une variable d'objet au lieu de l'attribut de classe ne change pas ici)


Lorsque deux utilisateurs se connectent en même temps, ils recevront la variable de session de chacun. Dans votre exemple, vos statistiques seraient désactivées. Toutefois, pour persister des informations personnelles de cette façon, il introduit une énorme fuite de sécurité / d'information sur le site Web.



0
votes

Vous pouvez créer un mixin de formulaire qui vous permet de persister les valeurs de formulaire à la session de l'utilisateur (qui ne les oblige pas à être connectée). Ceci est utile pour des éléments tels que des options de filtrage / tri sur un rapport de vue de la table publique, où vous souhaitez conserver leurs options de filtrage persistantes sur rafraîchissements.

 Capture d'écran du formulaire de filtrage P> Vue: P>

class PersistableMixin:
    def persist_to_session(form, session):
        for key in form.fields.keys():
            val = getattr(form, 'cleaned_data', form.data).get(key, None)
            if val:  # will not store empty str values
                session[key] = val
        return True

    def load_from_session(form, session):
        for key in form.fields.keys():
            saved_val = session.get(key, '')
            if saved_val:  # will not load empty str values
                form.fields[key].initial = saved_val
        return form


class StateListFilterForm(forms.Form, PersistableMixin):
    states = forms.MultipleChoiceField(required=False, choices=US_STATES)


0 commentaires

12
votes

Lors de la connexion, Django appelle session.flush () code> ou session.cycle_key () code>, ce qui ne garantit que rien de l'ancienne session n'est conservé. Il s'agit d'une mesure de sécurité qui vous protège contre les vulnérabilités de fixation de la session. Donc, lors de l'application de cette solution, soyez conscient de ce que vous trouvez des variables que vous souhaitez persister.

Si vous voulez garder un État, vous devrez restaurer cela après l'émission de la connexion. P>

Le Solution de Chase Seibert a été un bon départ, il était très peu sûr en raison de problèmes de threadsafety dans ce code. Vous pouvez trouver une version améliorée ici, qui est sûre à utiliser: p> xxx pré>

et maintenant vous pouvez écrire: p> xxx pré>

Et pour des vues à base de cours (Django-Allauth): p> xxx pré>

et utilisez cette vue dans les modèles d'URL: p>

import allauth.urls
from django.conf.urls import include, url

from . import views

urlpatterns = [
    # Views that overlap the default:
    url(r'^login/$', views.LoginView.as_view(), name='account_login'),

    # default allauth urls
    url(r'', include(allauth.urls)),
]


0 commentaires