Django学习笔记七:用户认证与授权

news/2024/10/8 8:54:59/

Django的用户认证与授权是Web开发中常见的需求,Django框架提供了一套完整的解决方案。以下是Django用户认证与授权的详细用法:

用户认证

用户认证是指确认用户身份的过程。Django默认使用用户名和密码进行认证,但也支持其他认证方式。

  1. 创建用户:使用User模型创建用户。

    from django.contrib.auth.models import User
    user = User.objects.create_user('username', 'email@example.com', 'password')
    
  2. 用户登录:使用authenticatelogin函数。

    from django.contrib.auth import authenticate, login
    def my_view(request):username = request.POST['username']password = request.POST['password']user = authenticate(request, username=username, password=password)if user is not None:login(request, user)# ...else:# 返回错误信息
    
  3. 用户登出:使用logout函数。

    from django.contrib.auth import logout
    def my_view(request):logout(request)# ...
    
  4. 密码管理:使用set_passwordcheck_password方法。

    user = User.objects.get(username='username')
    user.set_password('new_password')
    user.save()
    

用户授权

用户授权是指确定用户是否有权限执行特定操作的过程。

  1. 权限管理:使用Permission模型管理权限。

    from django.contrib.auth.models import Permission
    permission = Permission.objects.get(codename='change_user')
    
  2. 检查权限:使用has_perm方法检查用户是否有特定权限。

    if request.user.has_perm('auth.change_user'):# 用户有权限
    
  3. 组管理:使用Group模型管理用户组。

    from django.contrib.auth.models import Group
    group = Group.objects.create(name='New Group')
    group.permissions.add(permission)
    
  4. 装饰器:使用permission_required装饰器简化权限检查。

    from django.contrib.auth.decorators import permission_required
    @permission_required('auth.change_user')
    def my_view(request):# ...
    
  5. 自定义权限:创建自定义权限类。

    from rest_framework import permissions
    class IsAdminOrReadOnly(permissions.BasePermission):def has_permission(self, request, view):return request.user.is_staff
    

认证视图和URL

Django提供了一系列的认证视图和URL,如登录、登出、密码重置等。

  1. 使用认证视图:在项目的urls.py中包含认证URLs。

    from django.urls import include
    urlpatterns = [path('accounts/', include('django.contrib.auth.urls')),
    ]
    
  2. 自定义认证模板:创建自定义模板以覆盖默认的认证页面。

信号与事件处理

Django的认证系统提供了信号,如user_logged_in,你可以在用户登录时触发特定的操作。

  1. 信号接收器:创建信号接收器来响应认证事件。
    from django.contrib.auth.signals import user_logged_in
    from django.dispatch import receiver@receiver(user_logged_in)
    def my_user_logged_in(sender, request, user, **kwargs):# 用户登录后执行的操作
    

高级主题

  1. 会话管理:Django使用会话框架来管理用户会话。
  2. 客户端认证:例如OAuth2、JWT等,可以通过第三方库实现。
  3. 多因素认证:可以通过第三方库如django-mfa实现。

实战项目

在实战项目中,你可以将认证与权限控制应用于Django REST framework中,创建API时进行认证和权限控制。

以上是Django用户认证与授权的基础知识和一些高级用法。通过这些工具和方法,你可以为你的Web应用实现强大的用户认证和授权功能。

用户角色分配

在Django中,为不同的用户角色分配不同的权限,通常遵循以下步骤:

  1. 创建用户组(Group)
    Django的用户组可以用来对具有相同权限的用户进行分组。你可以创建一个组,然后定义这个组的权限。

    from django.contrib.auth.models import Group, Permission# 创建一个新组
    group = Group(name='Editor')
    group.save()# 获取某个权限,例如更改文章的权限
    permission = Permission.objects.get(codename='change_article')# 将权限添加到组
    group.permissions.add(permission)
    
  2. 将用户分配到组
    一旦你创建了组并分配了权限,你可以将用户添加到这些组中。

    from django.contrib.auth.models import User# 获取或创建用户
    user = User.objects.get(username='johndoe')# 将用户添加到组
    user.groups.add(group)
    
  3. 在视图中检查权限
    在你的视图中,你可以使用装饰器或在视图逻辑中检查用户是否有执行特定操作的权限。

    from django.contrib.auth.decorators import permission_required@permission_required('app_label.permission_codename')
    def my_view(request):# 视图逻辑pass
    

    或者在视图内部检查:

    def my_view(request):if request.user.has_perm('app_label.permission_codename'):# 允许执行的操作passelse:# 处理没有权限的情况pass
    
  4. 使用自定义权限
    如果内置的权限不足以满足需求,你可以创建自定义权限。

    from django.contrib.auth.models import Permission
    from django.contrib.contenttypes.models import ContentType# 获取或创建内容类型
    content_type = ContentType.objects.get_for_model(MyModel)# 创建自定义权限
    permission = Permission.objects.create(codename='can_publish',name='Can Publish',content_type=content_type,
    )
    
  5. 在模板中使用权限
    在Django模板中,你也可以使用权限来控制显示的内容。

    {% if perms.app_label.can_publish %}<p>You can publish articles.</p>
    {% endif %}
    
  6. 使用中间件进行权限检查
    你可以创建一个中间件来处理请求,并在其中进行权限检查。

    class CustomPermissionMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):if not request.user.has_perm('app_label.permission_codename'):# 没有权限时的处理passresponse = self.get_response(request)return response
    
  7. 使用第三方包
    对于更复杂的权限管理,如基于对象的权限,你可以使用第三方包,如django-guardian

    from guardian.shortcuts import assign_perm# 为用户分配对象级别的权限
    assign_perm('app_label.can_publish', user, obj)
    

通过这些步骤,你可以为Django项目中的不同用户角色分配合适的权限。记得在settings.py中配置好你的AUTH_USER_MODEL,如果你使用了自定义用户模型的话。


http://www.ppmy.cn/news/1536045.html

相关文章

后门攻击-Python案例

本文给出一个后门攻击&#xff08;Backdoor Attack&#xff09;示例&#xff0c;我们可以利用 PyTorch 在图像分类任务中训练一个模型&#xff0c;并加入恶意的“后门触发器”。后门触发器是一种特殊的模式或图案&#xff0c;攻击者在训练过程中将这些图案与目标标签绑定&#…

基于32单片机的博物馆安全监控系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 检测 分别是温湿度 光照 PM2.5、烟雾、红外&#xff0c;然后用OLED屏幕显示&#xff0c; 红外超过阈值则蜂鸣器报警&#xff0c;这是防盗报警&#xff1b;温度或烟雾超过阈值&#xff0c;则蜂鸣器…

【Blender Python】2.结合Kimi生成

概述 结合Kimi这样的AI工具可以生成Blender Python代码&#xff0c;用来辅助生成一些或简单或复杂的图形。当然&#xff0c;出不出错这就不一定了。因为AI所训练的版本可能并不是Blender的最新版本&#xff0c;类似的问题也出现在Godot上。 测试 在kimi中提问&#xff0c;获…

Linux 性能优化之CPU 多级缓存

写在前面 博文内容为 Linux CPU 多级缓存认知内容涉及&#xff1a; 什么是CPU多级缓存认知&#xff0c;CPU 硬件缓存信息&#xff0c;缓存流程写入策略&#xff0c;映射算法认知CPU 缓存分析&#xff0c;使用 valgring 和 Perf 分析CPU 缓存命中情况编码方面 CPU 缓存优化&…

ubuntu的useradd和adduser命令

useradd vs adduser 1. useradd 类型&#xff1a;Linux 命令。功能&#xff1a;用于创建新用户&#xff0c;但不会自动创建用户的主目录和密码。参数&#xff1a; -c&#xff1a;添加备注。-d&#xff1a;指定用户主目录。-e&#xff1a;设置用户有效期。-f&#xff1a;设置密…

18 Shell Script sort和uniq命令

sort和uniq命令 一、sort命令的使用 ​ sort 命令是帮我们依据不同的数据类型进行排序&#xff0c;并将结果写到标准输出。如果File 参数指定多个文件&#xff0c;那么sort 命令将这些文件连接起来&#xff0c;并当作一个文件进行排序 ​ 选项与参数 ​ –f &#xff1a;忽…

线性代数入门

线性代数入门 线性代数&#xff08;Linear Algebra&#xff09;是数学的重要分支之一&#xff0c;广泛应用于工程、计算机科学、物理学、经济学等领域。它主要研究向量、矩阵及其在空间中的变换。对于程序员来说&#xff0c;掌握线性代数的基础知识能够帮助更好地理解数据处理…

[C++] 小游戏 征伐 SLG DNF 0.0.2 版本 zty出品

目录 大家好~ 今天zty带来的是 War and Expedition SLG DNF 0.0.2 version 讲人话就是 War and Expedition &#xff08;游戏名&#xff0c;即征伐&#xff09; SLG &#xff08;即时战略类游戏&#xff09; DNF &#xff08;Did Not Finish&#xff09; 0.0.2 &#xff…