验证和授权
发布日期: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 User
      user = User.objects.create_user('zhiliao', 'hynever@zhiliao.com', '111111')
    • 创建超级用户:可以通过命令 python manage.py createsuperuser 或代码 create_superuser 方法创建。示例代码如下:
      from django.contrib.auth.models import User
      User.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 authenticate
      user = authenticate(username='zhiliao', password='111111')

    扩展 User 模型

    一对一外键扩展

    如果需要在 User 模型上添加自定义字段(如电话号码或学校),可以通过一对一外键的方式扩展。示例代码如下:

    from django.db import models
    from django.dispatch import receiver
    from django.db.models.signals import post_save
    class 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 AbstractUser
    from django.db import models
    class 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, UserManager
    from django.db import models
    class 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 login
    user = authenticate(username='zhiliao', password='111111')
    if user is not None and user.is_active:
    login(request, user)

    注销

    使用 logout 函数注销用户。示例代码如下:

    from django.contrib.auth import logout
    logout(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, ContentType
    from .models import Article
    content_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 Group
    group = Group.objects.create(name='运营组')

    绑定权限

    将权限分配给分组。示例代码如下:

    group.permissions.add(permission1, permission2)

    用户分组管理

    将用户添加到分组中。示例代码如下:

    user.groups.add(group)

    模板中的权限控制

    在模板中使用 auth 上下文处理器显示权限相关内容。示例代码如下:

    {% if perms.front.view_article %}
    添加文章
    {% endif %}
    上一篇:模型融合
    下一篇:python写手机APP

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年05月05日 02时19分54秒