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