、Djangoは古いセッションから必ず何も保たれているが行うものではありませんこれは、session.flush()
またはsession.cycle_key()
を呼び出します。これは、セッション固定の脆弱性からあなたを守るセキュリティ手段です。したがって、このソリューションを適用するときは、どのような変数を見つけるかを知りたいことがあります。
状態を保持したい場合は、ログインが発行された後に復元する必要があります。
Chase Seibertのソリューションはすばらしいスタートでしたが、そのコードのスレッドセーフな問題のために非常に安全ではありませんでした。あなたは使用しても安全である、ここでは改良版を見つけることができます。
class persist_session_vars(object):
"""
Some views, such as login and logout, will reset all session state.
(via a call to ``request.session.cycle_key()`` or ``session.flush()``).
That is a security measure to mitigate session fixation vulnerabilities.
By applying this decorator, some values are retained.
Be very aware what find of variables you want to persist.
"""
def __init__(self, vars):
self.vars = vars
def __call__(self, view_func):
@wraps(view_func)
def inner(request, *args, **kwargs):
# Backup first
session_backup = {}
for var in self.vars:
try:
session_backup[var] = request.session[var]
except KeyError:
pass
# Call the original view
response = view_func(request, *args, **kwargs)
# Restore variables in the new session
for var, value in session_backup.items():
request.session[var] = value
return response
return inner
、今あなたが書くことができます。
from django.contrib.auth import views
@persist_session_vars(['some_field'])
def login(request, *args, **kwargs):
return views.login(request, *args, **kwargs)
とクラスベースのビュー(ジャンゴ-allauth)について:
import allauth.account.views as auth_views
from django.utils.decorators import method_decorator
@method_decorator(persist_session_vars(['some_field']), name='dispatch')
class LoginView(auth_views.LoginView):
pass
とそのパターンをURLパターンで使用してください:
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)),
]
これは基本的に私の質問に答える、ありがとう! –