django登錄認證

Django認證系統的組成部分包括:User,Permission,Group

在暗中,Django維護一個”authentication backends”的列表用來測試認證。當某人調用 django.contrib.auth.authenticate() — 上面提到的”如何登錄一個用戶” — Django將嘗試所有的認證後端。如果第一個認證方法失敗了,Django將會繼續嘗試第二個,直到所有的都被嘗試過。

(‘django.contrib.auth.backends.ModelBackend’,)
這是檢測Django用戶數據庫的基本認證方案。

一個認證後端是一個類,實現了2個方法:get_user(id) 和 authenticate(**credentials) 。

get_user 方法接受一個 id — 可以是用戶名,數據庫ID或者其他的什麼 — 並且返回一個 User 對象。

authenticate方法接受字典類型認證信息的參數。

class MyBackend:
    def authenticate(username=None, password=None):
        # 檢測一個用戶名和密碼,然後返回一個User對象

當 authenticate 接受的參數被驗證爲有效的時候,應該返回一個 User 對象;如果無效的時候,應該返回 None 。 

在settings中有關用戶認證的默認設置:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', # default
    'oauth2_provider.backends.OAuth2Backend',
)

現在用戶的基本信息拓展爲含有手機號,而且手機號是唯一的,現實現用戶可以通過手機號實現登錄認證。在原來的認證之前通過手機號定位用戶,然後再使用該用戶名和輸入的密碼進行驗證。

代碼實現如下:

from django.contrib import auth
from oauth2_provider import backends

class ModelBackend(auth.backend):
     def authenticate(self, request, username=None, password=None, **kwargs):
        user = None
        if username:
            user = super().authenticate(request, username, password, **kwargs)
            if not user:
                username = User.objects.get(phone=username).username
                user = super().authenticate(request, username, password, **kwargs)
        return user

可以通過用戶名密碼,也可以通過手機號密碼進行登錄認證。若可以查到用戶就返回該用戶,否則返回None。

在上面的代碼中,可以通過print查看,reques is None,以下爲修改方案:

在validate_user方法中,u = authenticate(request, username=username, password=password)調用的時候將request傳過去就可以了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章