auth模塊是Django提供的標准權限管理系統,可以提供用戶認證、用戶組和權限管理。auth可以和django admin模塊配合使用、快速建立網站的管理系統。只需要在django的配置文件中INSTALLED_APPS中注冊‘django.contrib.auth’APP即可。
一、auth模塊相關的表
-
user表,User是auth模塊中維護用戶信息的表,在數據庫中該表被命名為auth_user. 該表繼承自Abstractuser.
-
group表,定義用戶組模型,該表只包含一個name字段和一個permissions(權限)多對多關系字段,在數據庫中被命名為auth_group.
-
Permission, 權限表,提供表級別的權限控制,可以檢查用戶是否對某個表擁有增(add),改(change),刪(delete)權限。
來看看三張表的關系:,,
從數據庫生成的表來看,這三張表實現了兩兩多對多的關聯,其中用戶和組生成的第三張表是auth_user_groups,group和permission生成的第三張表是auth_group_permissions,用戶和權限生成的第三張表是auth_user_user_permissions,如下圖:
二、User
在auth中user繼承自AbstractUser,其中AbstractUser又繼承自AbstractBaseUser和PermissionsMixin,其中AbstractBaseUser只保存了密碼和登陸時間,PermissionsMixin提供了權限先關的字段,比如:is_superuser和和組合權限表之間的關聯。
先來看下AbstractBaseUser這個表提供兩個字段,和多個基本方法:
1、字段也叫屬性
- password: 密碼字段
- last_login: 最后登陸時間
屬性方法:
is_anonymous: 是否為匿名用戶,永遠返回False。 2.0版本之后會被廢棄。
is_authenticated: 是否被認證,永遠返回True,。 2.0版本之后會被廢棄。
2、方法
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
三、Group
組提供的功能比較少,只包含一個name屬性和natural_key(返回一個元組)方法。
項目中引用:
from django.contrib.auth.models import Group
將用戶添加到組中:
group.user_set.add(user) #user為一個User對象,此處為表於表之間的多對多操作
四、Permission
權限系統提供一種方式去分配權限為用戶或組, 默認是為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進行權限驗證時,默認會有最高權限。