1. 程式人生 > >Django:認證系統

Django:認證系統

ida 自身 authent rom page 屬於 message 擁有 redirect

一,cookie和session

cookie不屬於http協議範圍,由於http協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個場景下誕生。

cookie的工作原理是:由服務器產生內容,瀏覽器收到請求後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能通過cookie的內容來判斷這個是“誰”了。

cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於cookie本身最大支持4096字節,以及cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節,並且他保存在服務器,有較高的安全性。這就是session。

問題來了,基於http協議的無狀態特征,服務器根本就不知道訪問者是“誰”。那麽上述的cookie就起到橋接的作用。

我們可以給每個客戶端的cookie分配一個唯一的id,這樣用戶在訪問時,通過cookie,服務器就知道來的人是“誰”。然後我們再根據不同的cookie的id,在服務器上保存一段時間的私密資料,如“賬號密碼”等等。

總結而言:cookie彌補了http無狀態的不足,讓服務器知道來的人是“誰”;但是cookie以文本的形式保存在本地,自身安全性較差;所以我們就通過cookie識別不同的用戶,對應的在session裏保存私密的信息以及超過4096字節的文本。

另外,上述所說的cookie和session其實是共通性的東西,不限於語言和框架

二,Django實現的cookie

1,獲取cookie

request.COOKIES[key]
request.get_signed_cookie(key, default=RAISE_ERROR, salt=‘‘, max_age=None)
    #參數:
        default: 默認值
           salt: 加密鹽
        max_age: 後臺控制過期時間

2,設置cookie

rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
 
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt
=加密鹽,...) 
技術分享圖片
   ‘‘‘

def set_cookie(self, key,                 鍵
             value=‘‘,            值
             max_age=None,        超長時間
             expires=None,        超長時間
             path=‘/‘,           Cookie生效的路徑,
                                         瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將
                                         cookie傳給站點中的其他的應用。
                                         / 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
             
                     domain=None,         Cookie生效的域名
                                        
                                          你可用這個參數來構造一個跨站cookie。
                                          如, domain=".example.com"
                                          所構造的cookie對下面這些站點都是可讀的:
                                          www.example.com 、 www2.example.com 
                         和an.other.sub.domain.example.com 。
                                          如果該參數設置為 None ,cookie只能由設置它的站點讀取。

             secure=False,        如果設置為 True ,瀏覽器將通過HTTPS來回傳cookie。
             httponly=False       只能http協議傳輸,無法被JavaScript獲取
                                         (不是絕對,底層抓包可以獲取到也可以被覆蓋)
          ): pass

‘‘‘
參數
<script src=/static/js/jquery.cookie.js>
 
</script> $.cookie("key", value,{ path: / });

三,Django實現的session

1,基本操作

1、設置Sessions值
          request.session[session_name] ="admin"
2、獲取Sessions值
          session_name = request.session["session_name"]
3、刪除Sessions值
          del request.session["session_name"]
4、檢測是否操作session值
          if "session_name" is request.session :

四,用戶認證

1,auth模塊

from django.contrib import aut

(1)authenticate()

提供了用戶認證,即驗證用戶名以及密碼是否正確,一般需要username password兩個關鍵字參數

user = authenticate(username=‘someone‘,password=‘somepassword‘)

(2)login(HttpRequest,user)

該函數接受一個HttpRequest對象,以及一個認證了的User對象

此函數使用django的session框架給某個已認證的用戶附加上session id等信息。

from django.contrib.auth import authenticate, login
   
def my_view(request):
  username = request.POST[username]
  password = request.POST[password]
  user = authenticate(username=username, password=password)
  if user is not None:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return an ‘invalid login‘ error message.
    ...

(3)logout(request)註銷用戶

from django.contrib.auth import logout
   
def logout_view(request):
  logout(request)
  # Redirect to a success page.

(4)user對象的is_authenticated()

要求:

1 用戶登陸後才能訪問某些頁面,

2 如果用戶沒有登錄就訪問該頁面的話直接跳到登錄頁面

3 用戶在跳轉的登陸界面中完成登陸後,自動訪問跳轉到之前訪問的地址

方法1:

def my_view(request):
  if not request.user.is_authenticated():
    return redirect(%s?next=%s % (settings.LOGIN_URL, request.path))

方法2:

django已經為我們設計好了一個用於此種情況的裝飾器:login_requierd()

from django.contrib.auth.decorators import login_required
      
@login_required
def my_view(request):
  ...

二,user對象

(1)is_authenticated()

如果是真正的 User 對象,返回值恒為 True 。 用於檢查用戶是否已經通過了認證。
通過認證並不意味著用戶擁有任何權限,甚至也不檢查該用戶是否處於激活狀態,這只是表明用戶成功的通過了認證。 這個方法很重要, 在後臺用request.user.is_authenticated()判斷用戶是否已經登錄,如果true則可以向前臺展示request.user.name

(2)創建用戶

使用 create_user 輔助函數創建用戶:

from django.contrib.auth.models import User
user = User.objects.create_user(username=‘‘,password=‘‘,email=‘‘

(3)check_password(passwd)

用戶需要修改密碼的時候 首先要讓他輸入原來的密碼 ,如果給定的字符串通過了密碼檢查,返回 True

(4)修改密碼

#使用 set_password() 來修改密碼
user = User.objects.get(username=‘‘)
user.set_password(password=‘‘)
user.save

由於cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。

1 2 3 <script src=‘/static/js/jquery.cookie.js‘> </script> $.cookie("key", value,{ path: ‘/‘ });

Django:認證系統