auth模塊是Django提供的標準權限管理系統,能夠提供用戶認證、用戶組和權限管理。auth能夠和django admin模塊配合使用、快速創建網站的管理系統。只須要在django的配置文件中INSTALLED_APPS中註冊‘django.contrib.auth’APP便可。數據庫
user表,User是auth模塊中維護用戶信息的表,在數據庫中該表被命名爲auth_user. 該表繼承自Abstractuser.django
group表,定義用戶組模型,該表只包含一個name字段和一個permissions(權限)多對多關係字段,在數據庫中被命名爲auth_group.app
Permission, 權限表,提供表級別的權限控制,能夠檢查用戶是否對某個表擁有增(add),改(change),刪(delete)權限。ide
來看看三張表的關係:,,
從數據庫生成的表來看,這三張表實現了兩兩多對多的關聯,其中用戶和組生成的第三張表是auth_user_groups,group和permission生成的第三張表是auth_group_permissions,用戶和權限生成的第三張表是auth_user_user_permissions,以下圖:網站
在auth中user繼承自AbstractUser,其中AbstractUser又繼承自AbstractBaseUser和PermissionsMixin,其中AbstractBaseUser只保存了密碼和登錄時間,PermissionsMixin提供了權限先關的字段,好比:is_superuser和和組合權限表之間的關聯。this
先來看下AbstractBaseUser這個表提供兩個字段,和多個基本方法:spa
一、字段也叫屬性code
- password: 密碼字段對象
- last_login: 最後登錄時間blog
屬性方法:
is_anonymous: 是否爲匿名用戶,永遠返回False。 2.0版本以後會被廢棄。
is_authenticated: 是否被認證,永遠返回True,。 2.0版本以後會被廢棄。
二、方法
get_username: 獲取用戶名,爲username字段。 Return the identifying username for this User。
set_password: 設置密碼。
check_password: 檢查密碼是否正確。
get_full_name: 獲取全名,一般爲first_name+last_name. 須要在子類裏重寫這個方法。
get_short_name: 獲取短名字,須要在子類裏重寫這個方法。
其中還有一些重寫了數據驗證的方法,好比clean等。
來看下PermissionsMixin這個類提供的字段和方法,官方解釋以下:
"""
A mixin class that adds the fields and methods necessary to support
Django's Group and Permission model using the ModelBackend.
"""
最小權限管理的基類。
屬性:
- is_superuser : 是否爲管理員。
- groups: 與組多對多關聯的字段。
- user_permissions: 與權限關聯的多對多字段,也就是是說明了爲何第三張表表爲auth_user_user_permissions. 表名(user)+字段名(user_permissions)
方法:
get_group_permissions: 獲取這個用戶所在組中所具備的的所有權限。
has_perm: 判斷一個用戶是否具備摸個權限。 經常使用。
has_perms: 判斷用戶對一個權限列表是否具備權限。
has_module_perms: 判斷對app是否有權限。
1 from django.contrib.auth.models import User,AbstractUser
組提供的功能比較少,只包含一個name屬性和natural_key(返回一個元組)方法。
from django.contrib.auth.models import Group
group.user_set.add(user) #user爲一個User對象,此處爲表於表之間的多對多操做
權限系統提供一種方式去分配權限爲用戶或組, 默認是爲Django Admin使用的,固然也能夠被咱們本身使用,Permission只提供表級別的‘add’\'change'\'delete’權限,並且在每張邊表建立後,對應的權限會自動建立。
屬性:
name: 權限描述別名
code_name: 權限描述,加上app名稱後能夠做爲has_perm()參數
content_type: django用來保持app和app下表之間關係的一個表。 在django中叫作:ContentType表。
In [13]: user.has_perm('app.delete_requestreusult') #前面爲APP名稱,後面爲權限名
從源碼中能夠看出,若是是已登陸的管理員在調用has_perm進行權限驗證時,默認會有最高權限。