欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django authenticate用戶身份認(rèn)證的項目實踐

 更新時間:2023年08月10日 11:50:38   作者:liulanba  
Django的contrib.auth模塊中的authenticate()函數(shù)用于對用戶的憑據(jù)進(jìn)行身份驗證,本文就來介紹一下django authenticate用戶身份認(rèn)證的使用,具有一定的參考價值,感興趣的可以了解一下

authenticate

Django的contrib.auth模塊中的authenticate()函數(shù)用于對用戶的憑據(jù)進(jìn)行身份驗證,與已配置的身份驗證后端進(jìn)行比較。

當(dāng)用戶嘗試登錄時,authenticate()函數(shù)將使用用戶的憑據(jù)(即用戶名和密碼)作為參數(shù)進(jìn)行調(diào)用,該函數(shù)然后檢查可用的身份驗證后端以驗證憑據(jù),這些后端在項目的settings.py文件中定義,如果憑據(jù)有效,則authenticate()函數(shù)返回已認(rèn)證的用戶對象;否則,它返回None。
在成功身份驗證后,可以使用Django的login()函數(shù)登錄用戶。

認(rèn)證后端

1.AUTHENTICATION_BACKENDS是Django設(shè)置中的一個參數(shù),它定義了用于身份驗證的后端認(rèn)證方式。這個參數(shù)是一個字符串列表,包含Django認(rèn)證系統(tǒng)使用的認(rèn)證后端類的全名。

2.當(dāng)用戶嘗試進(jìn)行身份驗證時,Django將按照AUTHENTICATION_BACKENDS中定義的順序,嘗試每個后端認(rèn)證方式,直到找到一個認(rèn)證方式成功為止。如果所有后端認(rèn)證方式都失敗,則身份驗證失敗。

3.默認(rèn)情況下,Django使用ModelBackend作為身份驗證后端,它基于Django中的用戶模型進(jìn)行身份驗證。除此之外,Django還提供了其他的身份驗證后端,如LDAPBackend、RemoteUserBackend等,也可以自定義身份驗證后端。

4.通過配置AUTHENTICATION_BACKENDS參數(shù),可以對身份驗證后端進(jìn)行定制,以滿足具體項目的需求。例如,如果你的項目需要使用LDAP進(jìn)行用戶身份驗證,則可以添加LDAPBackend到AUTHENTICATION_BACKENDS列表中,以便Django使用LDAPBackend進(jìn)行身份驗證。

from django.contrib.auth import authenticate
from django.contrib.auth import login as user_login
def my_login(request):
    """
    登錄視圖
    :param request:
    :return:
    """
    if request.method == "POST":
        login_form = users_form.UserForm(request.POST)
        if login_form.is_valid():
            username = login_form.cleaned_data['username']
            password = login_form.cleaned_data['password']
            myuser = authenticate(username=username, password=password)
            if myuser is not None:
                user_login(request, myuser)

這段代碼使用Django的contrib.auth模塊來進(jìn)行用戶身份驗證和登錄。
首先,它調(diào)用authenticate()函數(shù)驗證用戶的憑據(jù),如果憑據(jù)有效,則authenticate()函數(shù)將返回已認(rèn)證的用戶對象,并將其賦給myuser變量。如果憑據(jù)無效,則authenticate()函數(shù)將返回None。
接著,代碼檢查myuser變量是否為None。如果myuser不為None,則說明憑據(jù)有效,并且代碼將調(diào)用user_login()函數(shù)來將該用戶登錄到當(dāng)前會話中。user_login()函數(shù)需要傳遞一個request對象和已認(rèn)證的用戶對象。登錄成功后,用戶可以訪問需要認(rèn)證的頁面和視圖。
如果myuser為None,則說明憑據(jù)無效,用戶無法登錄。

myuser 和 request.user 是兩個不同的對象,其區(qū)別在于:
1.myuser 表示通過用戶名和密碼認(rèn)證成功后得到的用戶對象, 是通過表單驗證之后從數(shù)據(jù)庫中查詢出來的用戶對象,即 authenticate 方法返回的對象。主要用來檢查用戶輸入的用戶名和密碼是否正確,并在認(rèn)證成功后設(shè)置一些 session 變量。
2.request.user 表示當(dāng)前請求的用戶對象,是通過 Django 的認(rèn)證系統(tǒng)得到的用戶對象,包括通過認(rèn)證的用戶和未認(rèn)證的用戶。如果用戶已通過認(rèn)證,則該對象是一個 User 實例,否則是一個 AnonymousUser 實例。 主要用來獲取當(dāng)前認(rèn)證的用戶信息,例如用戶的用戶名、郵箱等。這些信息通常用來顯示在頁面上,或者用來判斷當(dāng)前用戶是否有權(quán)限進(jìn)行某些操作。

因此,在這個方法中,myuser 和 request.user 作用是相同的,都是用來判斷用戶是否已通過認(rèn)證,但是可能是不同的對象,因為 myuser 只在用戶認(rèn)證成功后才會有值,而 request.user 則是在每個請求中都會有值,不論用戶是否通過認(rèn)證。同時,在這個方法中,myuser 和 request.user 都可以用來檢查用戶是否已通過認(rèn)證,但是只有 request.user 才可以用來獲取當(dāng)前認(rèn)證的用戶信息。

authenticate函數(shù)如下:

@sensitive_variables("credentials")
def authenticate(request=None, **credentials):
    """
    If the given credentials are valid, return a User object.
    """
    for backend, backend_path in _get_backends(return_tuples=True):
        backend_signature = inspect.signature(backend.authenticate)
        try:
            backend_signature.bind(request, **credentials)
        except TypeError:
            # This backend doesn't accept these credentials as arguments. Try
            # the next one.
            continue
        try:
            user = backend.authenticate(request, **credentials)
        except PermissionDenied:
            # This backend says to stop in our tracks - this user should not be
            # allowed in at all.
            break
        if user is None:
            continue
        # Annotate the user object with the path of the backend.
        user.backend = backend_path
        return user

_get_backends會從settings.py中讀取AUTHENTICATION_BACKENDS定義的后端路徑:

def _get_backends(return_tuples=False):
    backends = []
    for backend_path in settings.AUTHENTICATION_BACKENDS:
        backend = load_backend(backend_path)
        backends.append((backend, backend_path) if return_tuples else backend)
    if not backends:
        raise ImproperlyConfigured(
            "No authentication backends have been defined. Does "
            "AUTHENTICATION_BACKENDS contain anything?"
        )
    return backends
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'backends.user_backend.UserBackend'
]

AUTHENTICATION_BACKENDS列表中包含了兩個認(rèn)證后端,分別是ModelBackend和UserBackend。Django將按照列表中的順序依次嘗試這兩個認(rèn)證后端,直到找到一個成功為止。

UserBackend需要繼承BaseBackend并實現(xiàn)一個authenticate函數(shù):

from django.contrib.auth.backends import BaseBackend
from users.models import MyUser
class UserBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            myuser = MyUser.objects.get(name=username)
            if myuser.check_password(password):
                return myuser
        except MyUser.DoesNotExist as e:
            print("user no exist", e)
            return None
    def get_user(self, user_id):
        try:
            return MyUser.objects.get(pk=user_id)
        except MyUser.DoesNotExist:
            return None

到此這篇關(guān)于django authenticate用戶身份認(rèn)證的項目實踐的文章就介紹到這了,更多相關(guān)django authenticate身份認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實現(xiàn)AHP算法的方法實例(層次分析法)

    python實現(xiàn)AHP算法的方法實例(層次分析法)

    這篇文章主要給大家介紹了關(guān)于python實現(xiàn)AHP算法(層次分析法)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • python實現(xiàn)識別相似圖片小結(jié)

    python實現(xiàn)識別相似圖片小結(jié)

    本文給大家分享的是使用Python實現(xiàn)圖片相似度識別的總結(jié),代碼實用pil模塊比較兩個圖片的相似度,根據(jù)實際實用,代碼雖短但效果不錯,還是非??孔V的。
    2016-02-02
  • PyTorch策略梯度算法詳情

    PyTorch策略梯度算法詳情

    這篇文章主要介紹了PyTorch策略梯度算法詳情,文章我們主要使用策略梯度算法解決CartPole問題,詳細(xì)的相關(guān)介紹,需要的朋友可以參考一下
    2022-07-07
  • TensorFlow中關(guān)于tf.app.flags命令行參數(shù)解析模塊

    TensorFlow中關(guān)于tf.app.flags命令行參數(shù)解析模塊

    這篇文章主要介紹了TensorFlow中關(guān)于tf.app.flags命令行參數(shù)解析模塊,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python數(shù)據(jù)庫編程之SQLite和MySQL的實踐指南

    Python數(shù)據(jù)庫編程之SQLite和MySQL的實踐指南

    這篇文章主要為大家詳細(xì)介紹了Python數(shù)據(jù)庫編程中SQLite和MySQL的相關(guān)操作指南,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Python中一行和多行import模塊問題

    Python中一行和多行import模塊問題

    我們通過本篇文章給大家分析了為什么Python不建議使用一行import所有模塊的原因,有興趣的朋友學(xué)習(xí)下。
    2018-04-04
  • PyCharm 在Windows的有用快捷鍵詳解

    PyCharm 在Windows的有用快捷鍵詳解

    這篇文章主要介紹了PyCharm 在Windows的有用快捷鍵,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • python 默認(rèn)參數(shù)問題的陷阱

    python 默認(rèn)參數(shù)問題的陷阱

    本文給大家講述的是python 默認(rèn)參數(shù)問題的陷阱,有需要的小伙伴可以參考下
    2016-02-02
  • Python文件基本操作實用指南

    Python文件基本操作實用指南

    這篇文章主要給大家介紹了Python文件基本操作的相關(guān)資料,其中包括打開文件的方式、按行讀取文件內(nèi)容、復(fù)制文件、重命名文件等操作需要的朋友可以參考下
    2021-05-05
  • 深入理解Python裝飾器

    深入理解Python裝飾器

    裝飾器(decorator)是一種高級Python語法。裝飾器可以對一個函數(shù)、方法或者類進(jìn)行加工。這篇文章主要介紹了深入理解Python裝飾器的相關(guān)資料,需要的朋友可以參考下
    2016-07-07

最新評論