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进行权限验证时,默认会有最高权限。