登錄驗證系統實例-三種(cookie,session,auth)

登錄驗證

  由於http協議是無狀態協議,可是咱們有時候須要這個狀態,這個狀態就是標識html

  前端提交from表單,後端獲取對應輸入值,與數據庫對比,由此對象設置一個標識,該對象前端

在別的視圖的時候,有此標識,能夠訪問,沒有則讓其去登錄數據庫

  因此,cookie,session應運而生django

 

一,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驗證 實際例子(登錄,註冊,更改密碼)cookie

注意,from表單裏面不該該有button按鈕,會當成數據提交session

 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")
相關文章
相關標籤/搜索