单用户登陆
session
- 登录
方法一
从记录session的数据库中删除之前用户的的所有记录
login(request, user) #登录成功
# 登录之后获取获取最新的session_key
session_key = request.session.session_key
# 删除非当前用户session_key的记录
for session in Session.objects.filter(~Q(session_key=session_key), expire_date__gte=timezone.now()):
data = session.get_decoded()
if data.get('_auth_user_id', None) == str(request.user.id):
session.delete()
方法二
建立user扩展表,增加session_key字段记录user登录信息
username = request.POST.get("username")
password = request.POST.get("password")
authenticated_user = authenticate(username=username, password=password)
if authenticated_user:
# 找到登录的user对象
user_obj = UCenter.objects.filter(userid=authenticated_user)
# 获取登录对象的session_key
is_session_key = user_obj.first().session_key
if is_session_key: # 用户已登录
# 删除django-session表中登录前面登录用户的session_key
request.session.delete(is_session_key)
# 用户信息存入session
auth_login(request, authenticated_user)
# 更新新user扩展表中登录user的session_key
user_obj.update(session_key=request.session.session_key)
return redirect('/index/')
else:
return redirect('/accounts/login/')
若有推送机制,则在登录后,推送至旧的设备上,提示用户已经再次登录,旧登录失效。
- 访问
使用正常的cookie-session验证,由于session_key的唯一性,当新用户登录后,就用户就无法继续使用之前的session_key.
JWT
- 登录
每个用户登录后,在redis中存储用户的jwt_token
。key是user_id
,value是用户最新的token
。
当新用户登录后,更新redis中存储用户的 token
。
若有推送机制,则在登录后,推送至旧的设备上,提示用户已经再次登录,旧登录失效。
- 访问
访问时,解码jwt_token
后,校验传输的token
是否是redis中存储的值。若是,则是新用户,若不是,则是之前的jwt_token