注意:本文翻譯自django1.8.2的官方文檔中的:Using the Django authentication system
這份文檔介紹了在默認配置下使用django的認證系統.默認配置已經能夠滿足大部分普遍的項目需求,能處理相當廣泛的任務,對於密碼和驗證有一個相對安全的實現.如果項目需要的認證與默認配置不同,django提供了對於默認配置的認證的擴展和定製
django認證提供了身份驗證(authentication)和權限管理(authorization),通常這2個並稱爲認證系統(authentication systom),因爲它們的功能有重合(耦合)
User objects
User對象是認證系統的核心.它通常表示訪問網站的人,用於限制連接,註冊使用者資料,將內容與內容產生者關聯等.django的認證框架裏只有一個user類,也就是說,superusers 或 admin ,staff 只是擁有特殊屬性的user對象集合,與user對象是用一個類(class).
默認的user的基本屬性有:
- username
- password
- first_name
- last_name
要查看完整內容請查看full API documentation,下面的文檔是more task oriented
Creating users
創建user最直接的方式是使用內置的create_user()方法:
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', '[email protected]', 'johnpassword')
# 這個時候,user是一個User對象,已經保存到數據庫了.
# 如果想改變其他字段的值,可以繼續改變它的屬性
>>> user.last_name = 'Lennon'
>>> user.save()
如果已經安裝了django admin,可以使用網頁交互,創建user
Creating superusers
使用createsuperuser命令創建superusers
$ python manage.py createsuperuser --username=joe --email=joe@example.com
會提示輸入密碼.輸入之後,會立即創建user,如果你沒有用–username或–email選項,系統會提示你輸入
Changing passwords
django不會存儲明文密碼,而是存儲一個哈希值.所以,不要直接操作user的密碼屬性.這也是爲什麼創建user時使用helper function的原因(使用了create_user,而不是通用的create).
改變user的密碼,有幾種方式:
manage.py changepassword “username”提供了在命令行改變user密碼的方法.他會提示你輸入2次.如果2次都輸入相同,新密碼會馬上改變.如果你沒有提供username,這個命令會嘗試改變最近的系統user的密碼
你也可以用編碼的方式更改密碼,使用set_password():
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
如果安裝了django admin,你也可以在認證系統的admin網頁裏更改user的密碼
django同樣提供了views和froms可以用於用戶更改他們的密碼
django1.7新增
如果SessionAuthenticationMiddleware可用,改變密碼會註銷session.
Authenticating Users
- authenticate(**credentials)
要驗證給定的username和password,使用authenticate(). 它
使用form中已經驗證格式的參數作爲關鍵字參數,默認配置下,這是username和password,如果密碼正確,它返回一個User對象.如果密碼不正確,authenticate()返回None.例如
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
# 驗證密碼
if user.is_active:
print("User is valid,active and authenticated")
else:
print("密碼正確,但是賬戶不可用")
else:
# username和password沒有通過驗證
print('用戶名或密碼不正確.')
Note:
這是比較低級的方法;例如,使用RemoteUserMiddleware.除非你自己寫認證系統,要不然你很可能用不到它.而如果你正在尋找一種方式來限制登錄用戶的訪問,請參閱login_required()裝飾器