通過session,我們可以在多次瀏覽器請求中保持資料, 接下來的部分就是用session來處理使用者登入了。 當然,不能僅憑使用者的一面之詞,我們就相信,所以我們需要認證。
當然了,Django 也提供了工具來處理這樣的常見任務(就像其他常見任務一樣)。 Django 使用者認證系統處理使用者帳號,組,許可權以及基於cookie的使用者會話。 這個系統一般被稱為 auth/auth (認證與授權)系統。 這個系統的名稱同時也表明了使用者常見的兩步處理。 我們需要
- 驗證 (認證) 使用者是否是他所宣稱的使用者(一般通過查詢資料庫驗證其使用者名稱和密碼)
- 驗證使用者是否擁有執行某種操作的 授權 (通常會通過檢查一個許可權表來確認)
- 根據這些需求,Django 認證/授權 系統會包含以下的部分:
- 使用者 : 在網站註冊的人
- 許可權 : 用於標識使用者是否可以執行某種操作的二進位(yes/no)標誌
- 組 :一種可以將標記和許可權應用於多個使用者的常用方法
- Messages : 向使用者顯示隊列式的系統訊息的常用方法
如果你已經用了admin工具(詳見第6章),就會看見這些工具的大部分。如果你在admin工具中編輯過使用者或組,那麼實際上你已經編輯過授權系統的資料庫表了。
開啟認證支援
像session工具一樣,認證支援也是一個Django應用,放在 django.contrib 中,所以也需要安裝。 與session系統相似,它也是預設安裝的,但如果它已經被刪除了,通過以下步驟也能重新安裝上:
- 根據本章早前的部分確認已經安裝了session 架構。 需要確認使用者使用cookie,這樣sesson 架構才能正常使用。
- 將 'django.contrib.auth' 放在你的 INSTALLED_APPS 設定中,然後運行 manage.py syncdb以建立對應的資料庫表。
- 確認 SessionMiddleware 後面的 MIDDLEWARE_CLASSES 設定中包含 'django.contrib.auth.middleware.AuthenticationMiddleware' SessionMiddleware。
這樣安裝後,我們就可以在視圖(view)的函數中處理user了。 在視圖中存取users,主要用 request.user ;這個對象表示當前已登入的使用者。 如果使用者還沒登入,這就是一個AnonymousUser對象(細節見下)。
你可以很容易地通過 is_authenticated() 方法來判斷一個使用者是否已經登入了:
if request.user.is_authenticated(): # Do something for authenticated users.else: # Do something for anonymous users.
使用User對象
User 執行個體一般從 request.user ,或是其他下面即將要討論到的方法取得,它有很多屬性和方法。 AnonymousUser 對象類比了 部分 的介面,但不是全部,在把它當成真正的user對象 使用前,你得檢查一下 user.is_authenticated() 表14-3和14-4分別列出了`` User`` 對象中的屬性(fields)和方法。
System Message: ERROR/3 (, line 735)
Error parsing content block for the “table” directive: exactly one table expected.
.. table:: 表 ``User`` 對象方法
代碼如下:
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|方法 |描述 |
+=============================================================================================+======================================================================================================================================================+
|``is_authenticated()`` |對於真實的User對象,總是返回\ `` True`` 。 |
| |這是一個分辨使用者是否已被鑒證的方法。 它並不意味著任何許可權,也不檢查使用者是否仍是活動的。 它僅說明此使用者已被成功鑒證。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``is_anonymous()`` |對於\ `` AnonymousUser`` 對象返回\ `` True`` (對於真實的\ `` User`` 對象返回\ `` False`` )。 |
| |總的來說,比起這個方法,你應該傾向於使用\ `` is_authenticated()`` 方法。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``get_full_name()`` |返回\ `` first_name`` 加上\ `` last_name`` ,中間插入一個空格。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``set_password(passwd)`` |設定使用者密碼為指定字串(自動處理成雜湊串)。 實際上沒有儲存\ ``User``\對象。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|check_password(passwd) |如果指定的字串與使用者密碼匹配則返回\ ``True``\。 比較時會使用密碼雜湊表。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``get_group_permissions()`` |返回一個使用者通過其所屬組獲得的許可權字串列表。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``get_all_permissions()`` |返回一個使用者通過其所屬組以及自身許可權所獲得的許可權字串列表。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``has_perm(perm)`` |如果使用者有指定的許可權,則返回\ `` True`` ,此時\ `` perm`` 的格式是\ `` "package.codename"`` 。如果使用者已不活動,此方法總是返回\ `` False`` 。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|has_perms(perm_list) |如果使用者擁有\ * 全部* 的指定許可權,則返回\ `` True`` 。 如果使用者是不活動的,這個方法總是返回\ `` False`` 。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``has_module_perms(app_label)`` |如果使用者擁有給定的\ `` app_label`` 中的任何許可權,則返回\ `` True`` 。如果使用者已不活動,這個方法總是返回\ `` False`` 。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|get_and_delete_messages() |返回一個使用者隊列中的\ `` Message`` 對象列表,並從隊列中將這些訊息刪除。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``email_user(subj, msg)`` |向使用者發送一封電子郵件。 這封電子郵件是從\ `` DEFAULT_FROM_EMAIL`` 設定的地址發送的。 你還可以傳送一個第三參數:\ `` from_email`` ,以覆蓋電郵中的發送地址。|
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
最後,`` User`` 對象有兩個many-to-many屬性。 `` groups`` 和`` permissions`` 。正如其他的many-to-many屬性使用的方法一樣,`` User`` 對象可以獲得它們相關的對象:
# Set a user's groups:myuser.groups = group_list# Add a user to some groups:myuser.groups.add(group1, group2,...)# Remove a user from some groups:myuser.groups.remove(group1, group2,...)# Remove a user from all groups:myuser.groups.clear()# Permissions work the same waymyuser.permissions = permission_listmyuser.permissions.add(permission1, permission2, ...)myuser.permissions.remove(permission1, permission2, ...)myuser.permissions.clear()