日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

session 修改密码python_django修改密码强制退出机制

發布時間:2023/12/18 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 session 修改密码python_django修改密码强制退出机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

起因

BUG出現

系統升級django版本后經常出現自動退出登錄

問題復現

系統升級django(大版本,如1.8、1.11和2.0)后,舊版與新版同時運行,同一各User用舊版authenticate驗證后會導致新版中已登錄User被退出。

正常使用中的登陸、退出和會話保持

登錄

from django.contrib.auth import authenticate, login , logout

def login(request):

if request.method == "POST":

username = request.POST.get('username', '')

password = request.POST.get('password', '')

user = authenticate(username=username, password=password) # 驗證用戶帳號密碼是否正確,通過后返回User對象

if not user:

login(request, user) # 登錄,response添加cookie并將session_key記錄到django_session

request.session.set_expiry(0)# 設置session失效時間,0表示關閉瀏覽器失效

return HttpResponseRedirect('/')

退出

from django.contrib.auth import authenticate, login , logout

def logout(request):

logout(request)# 清除response的cookie和django_session中記錄

return HttpResponseRedirect('/login')

保持登陸狀態

成功登錄后瀏覽器將在每次請求時Header中附帶cookie

settings.py配置:

SECRET_KEY = '%iai=j+uyd4s0t3qm$3w-w6^b0lf!df%hh-@5f!0&4enc(o7#5'# key變化密碼的hash也會變

MIDDLEWARE = (

# ... 無關部分省略

'django.contrib.sessions.middleware.SessionMiddleware', # 獲取cookie中sessionid對應的django_session,有效的時候會把session對象增加到request.session

'django.contrib.auth.middleware.AuthenticationMiddleware',# 根據request.session獲取對應User并校驗是否有效

# ... 無關部分省略

)

尋根溯源

具體過程比較曲折,一言難盡。

會話保持依賴兩個中間件SessionMiddleware和AuthenticationMiddleware,其中AuthenticationMiddleware通過request.session獲取用戶對象,并比對此時用戶認證和session中存儲的認證是否相同

HASH_SESSION_KEY = '_auth_user_hash'

# auth.get_user

def get_user(request):

"""

Return the user model instance associated with the given request session.

If no user is retrieved, return an instance of `AnonymousUser`.

"""

from .models import AnonymousUser

user = None

try:

user_id = _get_user_session_key(request)

backend_path = request.session[BACKEND_SESSION_KEY]

except KeyError:

pass

else:

if backend_path in settings.AUTHENTICATION_BACKENDS:

backend = load_backend(backend_path)

user = backend.get_user(user_id)

# Verify the session

if hasattr(user, 'get_session_auth_hash'):

session_hash = request.session.get(HASH_SESSION_KEY)

session_hash_verified = session_hash and constant_time_compare(

session_hash,

user.get_session_auth_hash()

)

if not session_hash_verified:

request.session.flush()

user = None

return user or AnonymousUser()

也就是session_hash_verified = session_hash and constant_time_compare(session_hash,user.get_session_auth_hash()),對比session._auth_user_hash和user.get_session_auth_hash()是否相同 django_session中session_data默認存儲的如下信息:

{

'_auth_user_id': '25',

'_auth_user_backend': 'django.contrib.auth.backends.ModelBackend',

'_auth_user_hash': '54332f14831144a4022e7601c6dd3fcc531a5454',

'_session_expiry': 0

}

user.get_session_auth_hash()如下(User的父類):

class AbstractBaseUser(models.Model):

def get_session_auth_hash(self):

"""

Return an HMAC of the password field.

"""

key_salt = "django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash"

return salted_hmac(key_salt, self.password).hexdigest()

那么影響hash的就是user.password,django這么做原本是要實現修改密碼強制用戶自動退出。django文檔

修改密碼強制用戶自動退出的特性在django 2.0之前版本需要添加'django.contrib.auth.middleware.SessionAuthenticationMiddleware'到 MIDDLEWARE_CLASSES才能啟用此特性,2.0開始移除此中間件并強制啟用此特性

當用戶密碼被修改后,hash變化,判斷為session失效

當不同版本django中authenticate()時會自動重新生成密碼的密文,導致數據庫中密碼密文變化,hash也變化,判斷為session失效,這就是文章開始bug的原因

升級django密碼密文變化原因d

繞過修改密碼強制退出的方法

兩種方法

方法1: 每次請求不嚴重hash(僅適用于自定義User的) 屏蔽user.get_session_auth_hash()方法,使跳過hash比對

class User(AbstractBaseUser):

# ... 無關的省略

def __getattribute__(self, item):

if item == 'get_session_auth_hash':

raise AttributeError

return super().__getattribute__(item)

方法2: 保證不同版本密碼密文一致 settings.py

PASSWORD_HASHERS = [

'core.password.CustomPBKDF2PasswordHasher',

]

core.password.py

from django.contrib.auth.hashers import PBKDF2PasswordHasher

class CustomPBKDF2PasswordHasher(PBKDF2PasswordHasher):

iterations = 20000# 所有系統指定此值為一樣,能使密碼密文不變

總結

以上是生活随笔為你收集整理的session 修改密码python_django修改密码强制退出机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一二三区在线观看 | 日韩欧美视频在线免费观看 | 亚洲国产日韩一区无码精品久久久 | 激情五月五月婷婷 | av看片在线 | 韩国一区二区视频 | 成人免费精品视频 | 午夜av网址 | 伊人久久超碰 | 欧美另类视频在线 | 亚洲va在线∨a天堂va欧美va | 久久网站免费看 | 亚洲第一福利网站 | 五级黄高潮片90分钟视频 | 免费日韩av | 精品视频一区二区三区四区五区 | 国产成人午夜精品无码区久久 | 少妇人妻好深好紧精品无码 | 国产一区二区三区在线观看 | 午夜精品久久久久久久爽 | 国产三级久久 | 永久免费看mv网站入口78 | 亚洲人妻电影一区 | 欧美变态视频 | 欧美黑吊大战白妞 | 欧美揉bbbbb揉bbbbb | 亚洲一区免费在线 | 成人做爰www免费看视频网站 | 中文一区在线 | 精品国产一区二区三区日日嗨 | 男人插入女人下面视频 | 中文一二三区 | 麻豆精品av | 少妇性l交大片免费观看 | 嫩草一区| 色香色香欲天天天影视综合网 | eeuss鲁片一区二区三区在线观看 | 人妻精品无码一区二区三区 | 欧美黄色片 | 国产黄在线播放 | 青青草亚洲 | 久久羞羞| 黑人性生活视频 | 精品999视频| 欧美 日韩 国产 成人 在线 91 | 亚洲黄色免费电影 | 在线免费观看黄色片 | 欧美在线观看网站 | 亚洲av激情无码专区在线播放 | 国产l精品国产亚洲区久久 午夜青青草 | 男人天堂综合 | 国产极品免费 | 老妇女玩小男生毛片 | 国产一区二区三区 | 99国产精品国产精品九九 | 国产aⅴ爽av久久久久成人 | sao虎视频在线精品永久 | 久久久91 | 欧美xxxx69 | 黄色女女| 打开免费观看视频在线播放 | 日韩av午夜 | 特级精品毛片免费观看 | 精品1区2区| 亚洲一区二区三区久久 | 成人黄色一区二区三区 | 在线观看免费视频黄 | 国产中出 | 制服诱惑一区二区三区 | 毛片毛多水多 | 久久久啊啊啊 | 日本a级大片 | 成人小视频免费 | 91一二区| 777午夜| 日本网站在线看 | 国产一级aa大片毛片 | 久久伊人精品 | 国产视频久久久久 | 在哪里可以看黄色片 | 成年人免费网 | 鲁鲁狠狠狠7777一区二区 | 韩国日本美国免费毛片 | 成人免费va视频 | 国产色无码精品视频国产 | 中国白嫩丰满人妻videos | 亚洲 欧美 激情 小说 另类 | 高清国产午夜精品久久久久久 | 桃色av| 免费看美女被靠到爽的视频 | 69堂视频| 99久久毛片 | 国产亚洲一区二区不卡 | 成年人在线观看网站 | 少妇荡乳情欲办公室456视频 | 久久伊人在 | 91av视频在线免费观看 | 黄色av网站免费在线观看 | 欧美老熟妇乱大交xxxxx |