authenticate
Django的contrib.auth模塊中的authenticate()函數(shù)用于對用戶的憑據(jù)進行身份驗證,與已配置的身份驗證后端進行比較。
當用戶嘗試登錄時,authenticate()函數(shù)將使用用戶的憑據(jù)(即用戶名和密碼)作為參數(shù)進行調(diào)用,該函數(shù)然后檢查可用的身份驗證后端以驗證憑據(jù),這些后端在項目的settings.py文件中定義,如果憑據(jù)有效,則authenticate()函數(shù)返回已認證的用戶對象;否則,它返回None。
在成功身份驗證后,可以使用Django的login()函數(shù)登錄用戶。
認證后端
1.AUTHENTICATION_BACKENDS是Django設(shè)置中的一個參數(shù),它定義了用于身份驗證的后端認證方式。這個參數(shù)是一個字符串列表,包含Django認證系統(tǒng)使用的認證后端類的全名。
2.當用戶嘗試進行身份驗證時,Django將按照AUTHENTICATION_BACKENDS中定義的順序,嘗試每個后端認證方式,直到找到一個認證方式成功為止。如果所有后端認證方式都失敗,則身份驗證失敗。
3.默認情況下,Django使用ModelBackend作為身份驗證后端,它基于Django中的用戶模型進行身份驗證。除此之外,Django還提供了其他的身份驗證后端,如LDAPBackend、RemoteUserBackend等,也可以自定義身份驗證后端。
4.通過配置AUTHENTICATION_BACKENDS參數(shù),可以對身份驗證后端進行定制,以滿足具體項目的需求。例如,如果你的項目需要使用LDAP進行用戶身份驗證,則可以添加LDAPBackend到AUTHENTICATION_BACKENDS列表中,以便Django使用LDAPBackend進行身份驗證。
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模塊來進行用戶身份驗證和登錄。
首先,它調(diào)用authenticate()函數(shù)驗證用戶的憑據(jù),如果憑據(jù)有效,則authenticate()函數(shù)將返回已認證的用戶對象,并將其賦給myuser變量。如果憑據(jù)無效,則authenticate()函數(shù)將返回None。
接著,代碼檢查myuser變量是否為None。如果myuser不為None,則說明憑據(jù)有效,并且代碼將調(diào)用user_login()函數(shù)來將該用戶登錄到當前會話中。user_login()函數(shù)需要傳遞一個request對象和已認證的用戶對象。登錄成功后,用戶可以訪問需要認證的頁面和視圖。
如果myuser為None,則說明憑據(jù)無效,用戶無法登錄。
myuser 和 request.user 是兩個不同的對象,其區(qū)別在于:
1.myuser 表示通過用戶名和密碼認證成功后得到的用戶對象, 是通過表單驗證之后從數(shù)據(jù)庫中查詢出來的用戶對象,即 authenticate 方法返回的對象。主要用來檢查用戶輸入的用戶名和密碼是否正確,并在認證成功后設(shè)置一些 session 變量。
2.request.user 表示當前請求的用戶對象,是通過 Django 的認證系統(tǒng)得到的用戶對象,包括通過認證的用戶和未認證的用戶。如果用戶已通過認證,則該對象是一個 User 實例,否則是一個 AnonymousUser 實例。 主要用來獲取當前認證的用戶信息,例如用戶的用戶名、郵箱等。這些信息通常用來顯示在頁面上,或者用來判斷當前用戶是否有權(quán)限進行某些操作。
因此,在這個方法中,myuser 和 request.user 作用是相同的,都是用來判斷用戶是否已通過認證,但是可能是不同的對象,因為 myuser 只在用戶認證成功后才會有值,而 request.user 則是在每個請求中都會有值,不論用戶是否通過認證。同時,在這個方法中,myuser 和 request.user 都可以用來檢查用戶是否已通過認證,但是只有 request.user 才可以用來獲取當前認證的用戶信息。
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列表中包含了兩個認證后端,分別是ModelBackend和UserBackend。Django將按照列表中的順序依次嘗試這兩個認證后端,直到找到一個成功為止。文章來源:http://www.zghlxwxcb.cn/news/detail-449322.html
UserBackend需要繼承BaseBackend并實現(xiàn)一個authenticate函數(shù):文章來源地址http://www.zghlxwxcb.cn/news/detail-449322.html
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--用戶身份認證的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!