登陆验证系统实例-三种(cookie,session,auth)

登陆验证

  因为http协议是无状态协议,但是我们有时候需要这个状态,这个状态就是标识

  前端提交from表单,后端获取对应输入值,与数据库对比,由此对象设置一个标识,该对象

在别的视图的时候,有此标识,可以访问,没有则让其去登陆

  所以,cookie,session应运而生

 

一,cookie验证流程

1 cookie
2 客户端(浏览器)第一次请求登陆页面的时候,携带的cookie是空,响应页面也没有给cookie设置    
3 提交form 表单的时候,携带的cookie是空,服务器去判断,有这个用户,设置了cookie    
4 跳转到首页携带了cookie
5 删除cokkie
6 response.delete_cookie("cookie_key",path="/",domain=name)

设置cookie

 1 login 函数视图
 2 user=UserInfo.objects.filter(username=user,password=pwd).first()
 3 
 4 if user:
 5     obj=redirect("/index/")
 6     obj.set_cookie("is_login",True,path='/',max_age=10,expires=10)
 7     # cookie 参数
 8     # def set_cookie(self, key, 键
 9     #               value = '', 值
10     #              max_age = None, 超长时间
11     #              expires = None, 超长时间
12     #              path = '/', Cookie生效的路径,
13     # 浏览器只会把cookie回传给带有该路径的页面,这样可以避免将
14     # cookie传给站点中的其他的应用。
15     # / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
16     obj.set_cookie("username",user.username)
17     return obj
18 
19 index 函数视图
20 ret=request.COOKIES.get('is_login')
21 if ret: 
22     return render(request,"index.html")
23 return redirect("/login/")

 

二,cookie+session验证流程

1 cookie + session
2 与cookie 相同
3 只是cookie保存的是 session_id:随机字符串  客户端
4 随机字符串,data 以键值对方式保存在 django_session里面  服务器
5 跳转首页去跟服务器django_session去拿值
6 删除 session
7 可以删除 del request.session['is_login'] 这也只是在django_session里面的data里面删除这个键值对
8 还可以 这样 request.session.flush() 这样是删除django_sesssion里面的一条记录

设置session

 1 login 函数视图
 2 user=UserInfo.objects.filter(username=user,password=pwd).first()
 3 
 4 if user:
 5     # 注意这里设置 session
 6      request.session["Is_login"]=True
 7      return redirect("/index/")
 8 
 9 
10 index 函数视图
11 ret=request.session.get('is_login')
12 if ret: 
13     return render(request,"index.html")
14 return redirect("/login/")

 

三,auth验证流程

1 auth
2 与cookie 相同
3 随机字符串,data 以键值对方式保存在 django_session里面   客户端
4 跳转首页去跟服务器django_session去拿值    服务器
5 auth 模块有自己的验证机制,通过  
6    auth.authenticate(username=user,password=pwd)  匹配验证
7    auth.login(request,user)                 设置session
8    request.is_authenticated()           是否通过验证,返回true,false
9    auth.logout(request)           删除django_session一条记录

 

auth验证  ,httprequest.user

 1 HttpRequest.user
 2 
 3   一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。
 4 
 5   如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。
 6 
 7     例如:
 8 
 9     if request.user.is_authenticated():
10         # Do something for logged-in users.
11     else:
12         # Do something for anonymous users.
13 
14     user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。

 

auth验证 实际例子(登陆,注册,更改密码)

注意,from表单里面不应该有button按钮,会当成数据提交

 1 from django.contrib.auth.models import User
 2 from django.contrib import auth
 3 def login(request):
 4     if request.method == "POST":
 5         user = request.POST.get("user")
 6         pwd = request.POST.get("pwd")
 7         # django 利用自身auth_user表验证,去表里匹配
 8         user=auth.authenticate(username=user,password=pwd)
 9         if user:
10             # 验证通过,会记录在 djangos_session 表里面一条记录 给某个已认证的用户附加上session id
11             auth.login(request,user) #  设置session cookie记录 session_id:随机字符串 django_session 随机字符串:session_data
12             return redirect("/index/")
13 
14     return render(request, "login.html")
15 
16 def index(request):
17     user=request.user  #  显示当前登录用户对象
18 
19     if not user.is_authenticated(): #  是否通过验证
20          return redirect("/login/")
21 
22     name=request.user.username
23     return render(request,"index.html",{"name":name})
24 
25 def log_out(request):
26     '''
27     注销
28     :param request: 
29     :return: 
30     '''
31     auth.logout(request)  #  request.session.flush()
32     return redirect("/login/")
33 
34 
35 def reg(request):
36     if request.method == "POST":
37         user = request.POST.get("user")
38         pwd = request.POST.get("pwd")
39 
40         user=User.objects.create_user(username=user,password=pwd) #  创建用户信息
41         return redirect("/login/")
42 
43     return render(request,"reg.html")
44 
45 def setpwd(request):
46     '''
47     更改 密码 ###########
48     :param request: 
49     :return: 
50     '''
51     if request.method == "POST":
52         user = request.POST.get("user")
53         pre_pwd = request.POST.get("pre_pwd")
54         new_pwd = request.POST.get("new_pwd")
55         repeat_pwd = request.POST.get("repeat_pwd")
56         # 没有判断输入新密码2次是否一样
57         user=auth.authenticate(username=user,password=pre_pwd)
58         # 更改密码   #############################
59         if user:
60             user.set_password(new_pwd)
61             user.save()
62             return redirect("/login/")
63 
64     return render(request,"setpwd.html")

 

posted @ 2017-12-29 00:30  liqianlong  阅读(3163)  评论(0编辑  收藏  举报