简介Django的用户及权限系统
用户系统
- 1、用户
- 2、权限
- 3、分组
- 4、一个可以配置的密码哈希系统
- 5、一个可以插拔的后台管理系统
- app 引入
django.contrib.auth
模型定义django.contrib.contenttypes
模型权限关联
- 中间件
- SessionMiddleware 用来管理session
- AuthenticationMiddleware 管理和关联当前用户
- 引入
from django.contrib.auth.models
import User - 创建用户
- 创建普通用户
User.objects.create_user(username='zr',email='zr@qq.com',password='111111')
- 创建超级管理员
User.objects.creat_superuser()
- 创建普通用户
- 修改密码
user.set_password
这个方法会对密码进行加密,然后调用user.save()
保存
- 验证用户名和密码
- 引入
from django.contrib.auth import authenticate
用于验证用户名和密码 - 成功返回用户对象,失败返回None
- 引入
- 使用代理模型
- 1、新建模型继承User
- 2、在内置的Meta类中声明,
proxy=True
- 3、代理类使用的就是原来的类。
- 使用一对一外键的方式
- 1、新建一个扩展模型
- 2、进行一对一映射
OneToOneField
- 3、进行数据监听
- 4、监听引入
from django.dispatch import receiver
from django.db.models.signals import post_save
- 5、监听代码
def handler_user_extension(sender,instance,created,**kwargs):
if created:
UserExtension.objects.create(user=instance)
else:
instance.extension.save()
```
- 6、自定义验证系统
- django默认email是唯一表示用户的,但是在日常开发中一般使用手机号作为标识
- 其中验证用户密码 正确可以使用
user.check_password(password)
- 使用继承的方式
- 1、定义新模型继承
ABstractUser
- 2、在’setting.py’中配置
AUTH_USER_MODEL='模型路径(appname.modelsname)'
- 3、注意:一定要在第一次执行数据库迁移之前配置
- 4、重写objects
- 1、需要重写
UserManager
- 2、继承
BaseUserManager
- 3、重写create_user和create_superuser两个方法
- 4、在验证的时候传递的username是验证唯一性的,在
USERNAME_FIELD = 'username'
中配置,默认为username
- 1、需要重写
- 1、定义新模型继承
- 多重继承,去掉无用的user字段
- 1、定义新模型继承
AbstractBaseUser和PermissionsMixin
,其中AbstractBaseUser
包含两个字段,密码和最后登陆时间,PermissionsMixin
验证权限 - 2、定义相应的字段
- 必须的字段
is_active
- 必须属性
USERNAME_FIELD = 'telephone'
,用于验证唯一性的REQUIRED_FIELDS = ['username']
,用于在创建超级管理员时候提示的
- 必须方法
- get_full_name
- get_short_name
- 必须的字段
- 3、重写objects
- 4、注意:一定要在第一次数据迁移之前完成
- 1、定义新模型继承
- 【简介Django的用户及权限系统】获取用户模型的方法
- 引入
from django.contrib.auth import get_user_model
- 这个方法会根据setting.py中设置模型来获取相应的用户模型
- 引入
- 在authenticate验证之后,如果验证通过会返回一个user对象,拿到user对象之后可以使用django.contrib.auth.login进行登陆
- 自己定义的login函数不要叫做login,会与django自带的产生冲突。
- 注意:在表单验证的时候,模型中唯一的字段,已经在数据库中保存过了将无法通过模型表单的验证,需要自己写。
- 像 记住我 这样的按钮可以通过调整session过期时间来完成
- 调用 django 中的logout
- 退出登陆实现的功能其实就是将session设置为当前时间,即返回的session是已经过期的session
- 引入
from django.contrib.auth.decorators import login_required
,装饰器,可以传递参数login_url=‘url’
这个是如果未登陆将跳转到 - 使用登陆限制的时候,可以登陆完成可以通过GET得到next,进行跳转跳转到原来的页面
- 在创建模型的时候默认会生成三条权限,增加,修改,删除
- 可以在创建模型的时候自己添加权限
- 在模型的Meta类中添加属性
permissions = [ ('view_article',"查看的权限"),# 第一个参数为权限名,第二个为权限描述 ]
- 通过模型添加权限
from django.contrib.auth.models import Permission,ContentType
,引入权限模型和通过模型获取contenttype的方法content_type = ContentType.objects.get_for_model()
这个代码用来获取模型的位置- 创建权限的时候需要传的字段为(codename,name,content_type)分别是权限名,权限描述,模型位置
- 可以通过content_type来获取指定模型的权限
- 可以通过
user.user_permission.set(permissions)
来向用户设置多个权限 - 可以通过
user.user_permission.clear()
清空用户的所有权限 - 可以通过
user.user_permission.add(这里可以是一个权限,或者是打散的权限列表)
,添加权限 - 可以通过
user.user_permission.remove(这里可以是一个权限,或者是打散的权限列表)
移除权限 - 可以通过
user.has_perm('appname.codename')
appname 是app名,codename 是权限名,来判断这个用户有没有这个权限 - 可以通过
user.get_all_permissions()
获取用户全部权限
- 使用
request.user.is_authenticated
可以判断用户是否已经登陆,登陆了返回True,没登陆返回Flase - 使用
permission_required('appname.codename',login_url='',raise_exception=True)
,login_url 用户未登录跳转的url,raise_exception=True如果用户没权限将返回403状态,这个装饰器可以进行验证 permission_required
第一个参数可以传列表代表多个权限同时具有user.has_perms(['appname.codename',''])
,列表内权限同时具有的时候返回True
- 导入
from django.contrib.auth.models import Group
导入分组模型 - 创建分组
Group.objects.create(name="运营")
- 添加权限
group.permissions.set(permissions)
- 为用户添加分组
user.groups.add(group)
- 获取用户分组中的所有权限
user.group.get_group_permissions()
- 在模板内使用
{% if perms.appname.codename %}
perms.appname.codename 当前用户具有这个权限的时候是True
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量