
验证和授权
发布日期:2021-05-14 15:05:58
浏览次数:19
分类:精选文章
本文共 4640 字,大约阅读时间需要 15 分钟。
验证和授权系统概述
Django 内置了一个强大的授权系统,用于管理用户、分组、权限以及基于 cookie 的会话系统。该系统分为验证和授权两个主要部分,验证主要负责确认用户身份(如用户名和密码验证),而授权则负责赋予用户相应权限。
使用授权系统
在创建一个新 Django 项目后,授权系统就已经被集成。以下是与授权系统相关的主要配置项:
INSTALLED_APPS
django.contrib.auth
:包含核心授权框架和大部分模型定义。django.contrib.contenttypes
:用于关联模型和权限。
中间件
SessionMiddleware
:用于管理 session。AuthenticationMiddleware
:用于处理与当前 session 相关联的用户。
内置 User 模型的基本使用
User 模型概述
User 模型是 Django 授权系统的核心模型,位于 django.contrib.auth.models.User
。其主要字段包括:
username
:用户名,150 个字符以内,可包含数字和英文字符、@、+、.、-等符号,不能为空且必须唯一。first_name
:中文名,可为空。last_name
:姓氏,150 个字符以内,可为空。email
:邮箱,可为空。password
:经过哈希后的密码。groups
:用户所属的分组,可多对多关联。user_permissions
:用户拥有的权限,可多对多关联。is_staff
:是否是员工,决定是否可以进入 admin 端。is_active
:是否可用,用于软删除账号。is_superuser
:是否为超级管理员,拥有所有权限。last_login
:上次登录时间。date_joined
:账号创建时间。User 模型的基本操作
- 创建用户:使用
create_user
方法,传递 username、email 和 password。示例代码如下:from django.contrib.auth.models import Useruser = User.objects.create_user('zhiliao', 'hynever@zhiliao.com', '111111')
- 创建超级用户:可以通过命令
python manage.py createsuperuser
或代码create_superuser
方法创建。示例代码如下:from django.contrib.auth.models import UserUser.objects.create_superuser('admin', 'admin@example.com', '111111')
- 修改密码:使用
set_password
方法修改密码。示例代码如下:user = User.objects.get(pk=1)user.set_password('新的密码')user.save()
- 登录验证:使用
authenticate
方法验证用户名和密码。示例代码如下:from django.contrib.auth import authenticateuser = authenticate(username='zhiliao', password='111111')
扩展 User 模型
一对一外键扩展
如果需要在 User 模型上添加自定义字段(如电话号码或学校),可以通过一对一外键的方式扩展。示例代码如下:
from django.db import modelsfrom django.dispatch import receiverfrom django.db.models.signals import post_saveclass UserExtension(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='extension') birthday = models.DateField(null=True, blank=True) school = models.CharField(max_length=100) @receiver(post_save, sender=User) def create_user_extension(sender, instance, created, **kwargs): if created: UserExtension.objects.create(user=instance) else: instance.extension.save()
继承 AbstractUser
如果需要自定义验证方式但不想修改 User 模型的表结构,可以继承 AbstractUser
。示例代码如下:
from django.contrib.auth.models import AbstractUserfrom django.db import modelsclass User(AbstractUser): telephone = models.CharField(max_length=11, unique=True) school = models.CharField(max_length=100) USERNAME_FIELD = 'telephone' REQUIRED_FIELDS = [] class Meta: proxy = True objects = UserManager() def get_full_name(self): return self.username
继承 AbstractBaseUser
如果需要完全自定义用户验证和字段,可以继承 AbstractBaseUser
。示例代码如下:
from django.contrib.auth.models import AbstractBaseUser, UserManagerfrom django.db import modelsclass User(AbstractBaseUser, PermissionsMixin): telephone = models.CharField(max_length=11, unique=True) email = models.CharField(max_length=100, unique=True) username = models.CharField(max_length=100) is_active = models.BooleanField(default=True) USERNAME_FIELD = 'telephone' REQUIRED_FIELDS = [] objects = UserMannger() def get_full_name(self): return self.username def get_short_name(self): return self.username
登录、退出及权限控制
登录
使用 login
函数完成登录。示例代码如下:
from django.contrib.auth import loginuser = authenticate(username='zhiliao', password='111111')if user is not None and user.is_active: login(request, user)
注销
使用 logout
函数注销用户。示例代码如下:
from django.contrib.auth import logoutlogout(request)
登录限制
使用 login_required
装饰器限制访问权限。示例代码如下:
from django.contrib.auth.decorators import login_required@login_required(login_url='/login/')def my_view(request): pass
权限管理
添加权限
通过模型元数据定义权限。示例代码如下:
class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) class Meta: permissions = (('view_article', '可以查看文章'),)
通过代码添加权限
使用 Permission
模型创建自定义权限。示例代码如下:
from django.contrib.auth.models import Permission, ContentTypefrom .models import Articlecontent_type = ContentType.objects.get_for_model(Article)permission = Permission.objects.create( name='可以编辑文章', codename='edit_article', content_type=content_type)
用户权限管理
通过 User 模型操作权限。示例代码如下:
user = User.objects.first()if user.has_perm('front.view_article'): print('用户拥有查看文章的权限')
分组管理
创建分组
使用 Group
模型创建分组。示例代码如下:
from django.contrib.auth.models import Groupgroup = Group.objects.create(name='运营组')
绑定权限
将权限分配给分组。示例代码如下:
group.permissions.add(permission1, permission2)
用户分组管理
将用户添加到分组中。示例代码如下:
user.groups.add(group)
模板中的权限控制
在模板中使用 auth
上下文处理器显示权限相关内容。示例代码如下:
{% if perms.front.view_article %}添加文章{% endif %}
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年05月05日 02时19分54秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
伴随矩阵和逆矩阵的关系证明
2019-03-12
反向传播之矩阵求导dL/dz1的求导过程 普通神经网络的逆向求导过程
2019-03-12
numpy.linspace使用详解
2019-03-12
突破Bias-Variance困境
2019-03-12
函数可导和可微的区别: 一元中互为充要;多元中可微是可导的必要条件,可导不一定可微。
2019-03-12
一文说尽C++赋值运算符重载函数(operator=)
2019-03-12
Form窗体属性
2019-03-12
IC封装图片大全
2019-03-12
自恢复保险丝的选用
2019-03-12
开关电源 误差放大器电路
2019-03-12
Altium Designer唤出关掉的窗口
2019-03-12
输入过欠压保护电路原理图
2019-03-12
altium designer PCB 屏蔽DRC报错
2019-03-12
Windows7自动安装驱动功能关闭与开启教程
2019-03-12
MDK编译后生成bin文件占用FLASH大小说明
2019-03-12
六大原则
2019-03-12
Linux自有服务
2019-03-12
HDU A + B Problem II
2019-03-12