標籤:
一、概述
django有一套成型的註冊登入模組,auth 系統包含如下:
Users
Permission
Group
Message
在settings.py配置中,少不了以下配置
MIDDLEWARE_CLASSES = (‘django.middleware.common.CommonMiddleware‘,‘django.contrib.sessions.middleware.SessionMiddleware‘,‘django.contrib.auth.middleware.AuthenticationMiddleware‘,‘django.contrib.messages.middleware.MessageMiddleware‘,)INSTALLED_APPS = (‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.sites‘,‘django.contrib.messages‘,)
這些一般在建立django項目自動產生,運行 manage.py syncdb則產生相應的表。
二、Users
欄位
class models.User
User對象的具體欄位參考:django官網文檔
這裡注意is_active意思是:是否為活躍使用者,對於刪除使用者盡量設定其為false而非真正的刪除,同時也作為是否可登入的判定。
方法
更多參考django官網文檔
這裡指出幾個重點學習。
1、is_anonymous():區別匿名使用者和可登入使用者的方法,往往使用is_authenticated()。
2、is_authenticated():authenticated表示已驗證,那麼這個方法就是它只表明使用者提供一個有效使用者名稱和密碼。
3、set_password(raw_password):更改密碼,並自動處理hash值
4、check_password(raw_password):檢測密碼是否正確
三、管理方法(Manager functions)
class models.UserManager
1、create_user(username, email, password=None):建立、儲存並返回一個User,username,email和password被設定為給定的值,並且User設定了is_active=True.
2、make_random_password():
返回給定值和長度的隨機密碼:
make_random_password(length=10,allowed_chars=‘abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789‘)
四、基本用法
1、建立使用者
使用create_user()來建立使用者,如下:
from django.contrib.auth.models import Useruser = User.objects.create_user(‘BeginMan‘,‘abcd123‘,‘[email protected]‘)print user.is_staff #Trueuser.save()
2、更改密碼
使用set_password()變更
>>> from django.contrib.auth.models import User>>> u = User.objects.get(username__exact=‘john‘)>>> u.set_password(‘new password‘)>>> u.save()
五、web請求中的認證
詳細內容參考
1、基本概述
首先,安裝SessionMiddleware和AuthenticationMiddleware中介軟體。把他們加入到MIDDLEWARECLASSES設定中即可。當你安裝好這些中介軟體之後,你就可以在視圖(view)中訪問request.user了。request.user將返回當前登入的使用者的一個User對象。如果當前沒有使用者登入,那麼request.user將返回一個AnonymousUser對象的執行個體。你可以通過isauthenticated()來判斷是否有使用者登入,如下:
if request.user.is_authenticated(): #已登入使用者else: #匿名使用者
2、使用者登入
Django在django.contrib.auth提供了2個函數:authenticate()和login()。
authenticate():認證函數:
如果通過給定的使用者名稱和密碼做認證,請使用authenticate()函數。他接收2個參數,一個是username一個是password。如果認證成功,它返回一個User對象。如果密碼無效,它返回一個None。例如:
from django.contrib.auth import authenticateuser=authenticate(username=‘john‘,password=‘secret‘)ifuserisnotNone:print"使用者名稱、密碼正確!"else:print"使用者名稱、密碼錯誤!"
login():登入函數
在視圖中登入一個使用者的話,使用login()函數。它接收HttpRequest對象和一個User對象。login()通過Django的session架構把使用者的ID儲存到session中。
from django.contrib.auth import authenticate, logindef my_view(request): username = request.POST[‘username‘] password = request.POST[‘password‘] user = authenticate(username=username, password=password) if user is not None: if user.is_active: login(request, user) # Redirect to a success page. else: # Return a ‘disabled account‘ error message else: # Return an ‘invalid login‘ error message.
3、使用者登出
要登出使用
django.contrib.auth.login()登入的使用者的話,可以在視圖中使用
django.contrib.auth.logout()。它接收一個HttpRequest參數,沒有傳回值。例如:
from django.contrib.auth import logout def logout_view(request): logout(request) #轉到成功頁面
請注意:如果使用者沒有登入的話,logout()也不會拋出任何異常的。
六、限制使用者的訪問
1、原始方法
原始方法就是重新導向
如:if not request.user.is_authenticated():
2、使用login_required()修飾器
decorators.loginrequired([redirectfieldname=REDIRECTFIELD_NAME])
程式如下:
from django.contrib.auth.decorators import login_required@login_requireddef my_view(request): ...
login_required()原理:
如果使用者尚未登入,重新導向到settings.LOGIN_URL。
如果使用者已經登入則正常執行。
3、已登入使用者通過通行測試(passtest)來限制訪問
詳見官方文檔
七、許可權(Permissions)
Django內建了一個簡單的許可權系統。它為向使用者和使用者組付許可權提供了一個途徑。它被用在了Django的admin網站中,當然你也可以把它用在自己的代碼中。Django的admin網站是這樣應用許可權的:
通過"add"許可權來控制使用者是否可以訪問添加表單並添加一個指定類型的對象。通過"change"許可權來控制使用者是否可以訪問指定類型對象的列表和修改表單。*通過"delete"許可權來控制使用者是否可以刪除指定類型的對象。
許可權被賦予每種類型的對象,而不是對象的特定的執行個體。你可以說“瑪麗可以修改新的故事(stories)”,但是你不能說“瑪麗可以修改她建立的新的故事”或者“瑪麗只能修改特定狀態的、特定發布時間的、特定ID的故事等等”。這些功能目前Django的開發人員還在討論之中。
1、預設許可權
3個基本的許可權--添加(add),建立(create)和刪除(delete)--在建立包含有classAdmin的Django模型的時候都自動被建立好了。在表面現象的後面,當你運行manage.pysyncdb的時候,這些許可權被添加到了auth_permission資料表中。
請注意,如果你的模型裡沒有classAdmin的話,當你運行manage.pysyncdb的時候這些許可權不會被建立出來。如果你初始化資料庫之後還想添加這些許可權,可以在模型中加入class Admin然後再運行一次manage.pysyncdb。
2、自訂許可權
為了給指定的模型自訂許可權,可以使用許可權(permissions)的modelMetaattribute。這個例子建立了3個自訂的許可權。
class Task(models.Model): ... class Meta: permissions = ( ("can_view", "Can see available tasks"), ("can_change_status", "Can change the status of tasks"), ("can_close", "Can remove a task by setting its status as closed"), )
接下來的事情就是運行syncdb來建立這些許可權。
3、Permission的API
name:必須。小於等於50個字元。例如:‘Canvote‘。
contenttype:必須。引用自djangocontenttype資料表,它包含了已經安裝的
Django模型的類型。
codename:必須。小於等於100個字元。例如:‘canvote‘
八、模版中的認證資料
如果使用RequestContext的話,已經登入的使用者的user和權限物件就會儲存在template context中。
1、使用者(Users)
當前登入的使用者,不管是否是匿名的還是其他的,都儲存在模版變數{{user}}中。如:
{%ifuser.is_authenticated%} <p>歡迎,{{user.username}}。謝謝您的來訪。</p>{%else%} <p>歡迎,請登入。</p>{%endif%}
2、許可權(Permissions)
當前登入使用者的許可權儲存在模版變數{{perms}}中,是django.core.context_processors_PermWrapper的執行個體。
在{{perms}}對象中,單個屬性的尋找是使用User.hasmoduleperms的。下面這個例子中,如果使用者對foo這個app有任何許可權的話,它就返回True。{{perms.foo}}
二級屬性尋找是使用User.hasperm。下面這個例子中,如果使用者有foo.canvote許可權的話,它就返回True。{{perms.foo.can_vote}}因此,你可以在模板中用{%if%}語句來判斷許可權
{%ifperms.foo%}<p>你有操作foo的許可權。</p>{%ifperms.foo.can_vote%}<p>你可以投票。</p>{%endif%}{%ifperms.foo.can_drive%}<p>你可以開車。</p>{%endif%}{%else%}<p>你沒有操作foo的許可權。</p>{%endif%}
九、組(Groups)
組通常用來歸類使用者,這樣你就可以為這些組裡面的使用者應用許可權或者貼其他的標籤。一個使用者可以屬於任意數量的組。
組中的使用者自動獲得賦予組的許可權。例如,如果組Siteeditors有canedithome_page的許可權,那麼任何加入這個組的使用者都自動擁有這個許可權。
組也是歸類使用者並給他們貼標籤或擴充功能的一個方便的途徑。例如,你建立一個‘Specialusers‘的組,你可以寫代碼來讓他們訪問網站的會員專區或者發送給他們會員專用的電子郵件。
django 註冊、登入及第三方介面程式(1):基礎知識