每天40分玩转Django:Django认证系统

打印 上一主题 下一主题

主题 833|帖子 833|积分 2501

Django认证系统

一、今日学习内容概述

学习模块重要程度预计学时主要内容用户认证基础⭐⭐⭐⭐⭐1.5小时User模子、认证机制用户权限管理⭐⭐⭐⭐⭐1.5小时权限系统、权限控制用户组管理⭐⭐⭐⭐1小时组的创建和管理自定义认证⭐⭐⭐⭐2小时自定义用户模子、认证后端 二、用户认证基础实现

2.1 创建自定义用户模子

  1. # accounts/models.py
  2. from django.contrib.auth.models import AbstractUser
  3. from django.db import models
  4. class CustomUser(AbstractUser):
  5.     phone = models.CharField('手机号', max_length=11, blank=True)
  6.     avatar = models.ImageField('头像', upload_to='avatars/', null=True, blank=True)
  7.     bio = models.TextField('个人简介', max_length=500, blank=True)
  8.    
  9.     class Meta:
  10.         verbose_name = '用户'
  11.         verbose_name_plural = verbose_name
  12.         
  13.     def __str__(self):
  14.         return self.username
复制代码
2.2 配置认证设置

  1. # settings.py
  2. AUTH_USER_MODEL = 'accounts.CustomUser'
  3. # 认证相关设置
  4. LOGIN_URL = '/accounts/login/'
  5. LOGIN_REDIRECT_URL = '/'
  6. LOGOUT_REDIRECT_URL = '/accounts/login/'
复制代码
2.3 实现认证视图

  1. # accounts/forms.py
  2. from django import forms
  3. from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
  4. from .models import CustomUser
  5. class CustomUserCreationForm(UserCreationForm):
  6.     class Meta(UserCreationForm.Meta):
  7.         model = CustomUser
  8.         fields = ('username', 'email', 'phone', 'password1', 'password2')
  9.         
  10.     def __init__(self, *args, **kwargs):
  11.         super().__init__(*args, **kwargs)
  12.         for field in self.fields.values():
  13.             field.widget.attrs['class'] = 'form-control'
  14. # accounts/views.py
  15. from django.shortcuts import render, redirect
  16. from django.contrib.auth import login, logout
  17. from django.contrib.auth.decorators import login_required
  18. from django.contrib import messages
  19. from .forms import CustomUserCreationForm
  20. def register(request):
  21.     if request.method == 'POST':
  22.         form = CustomUserCreationForm(request.POST)
  23.         if form.is_valid():
  24.             user = form.save()
  25.             login(request, user)
  26.             return redirect('home')
  27.     else:
  28.         form = CustomUserCreationForm()
  29.     return render(request, 'accounts/register.html', {'form': form})
  30. @login_required
  31. def profile(request):
  32.     return render(request, 'accounts/profile.html')
复制代码
2.4 创建认证模板

  1. <!-- templates/accounts/login.html -->
  2. {% extends 'base.html' %}
  3. {% block content %}
  4. <div class="row justify-content-center">
  5.     <div class="col-md-6">
  6.         <div class="card">
  7.             <div class="card-body">
  8.                 <h2 class="card-title text-center">用户登录</h2>
  9.                 <form method="post">
  10.                     {% csrf_token %}
  11.                     {{ form.as_p }}
  12.                     <button type="submit" class="btn btn-primary w-100">登录</button>
  13.                 </form>
  14.                 <p class="text-center mt-3">
  15.                     还没有账号?<a href="{% url 'register' %}">立即注册</a>
  16.                 </p>
  17.             </div>
  18.         </div>
  19.     </div>
  20. </div>
  21. {% endblock %}
复制代码
三、权限系统实现

3.1 创建自定义权限

  1. # app/models.py
  2. class Article(models.Model):
  3.     title = models.CharField(max_length=200)
  4.     content = models.TextField()
  5.     author = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
  6.    
  7.     class Meta:
  8.         permissions = [
  9.             ("can_publish_article", "Can publish article"),
  10.             ("can_edit_others_article", "Can edit others article"),
  11.         ]
复制代码
3.2 权限装饰器使用

  1. # app/views.py
  2. from django.contrib.auth.decorators import permission_required
  3. @permission_required('app.can_publish_article', raise_exception=True)
  4. def publish_article(request):
  5.     # 发布文章的逻辑
  6.     pass
  7. # 多个权限检查
  8. @permission_required(['app.can_publish_article', 'app.can_edit_others_article'], raise_exception=True)
  9. def edit_article(request):
  10.     # 编辑文章的逻辑
  11.     pass
  12. # 使用用户测试函数
  13. from django.contrib.auth.decorators import user_passes_test
  14. def email_verified(user):
  15.     return user.email and user.is_active
  16. @user_passes_test(email_verified)
  17. def protected_view(request):
  18.     # 受保护的视图逻辑
  19.     pass
复制代码
3.3 在模板中使用权限

  1. {% if perms.app.can_publish_article %}
  2.     <a href="{% url 'publish_article' %}" class="btn btn-primary">发布文章</a>
  3. {% endif %}
  4. {% if user.has_perm('app.can_edit_others_article') %}
  5.     <a href="{% url 'edit_article' article.id %}" class="btn btn-warning">编辑</a>
  6. {% endif %}
复制代码
四、用户组管理

4.1 创建和管理用户组

  1. # accounts/admin.py
  2. from django.contrib import admin
  3. from django.contrib.auth.admin import UserAdmin
  4. from .models import CustomUser
  5. class CustomUserAdmin(UserAdmin):
  6.     list_display = ('username', 'email', 'phone', 'is_staff', 'is_active')
  7.     list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
  8.     fieldsets = UserAdmin.fieldsets + (
  9.         ('自定义字段', {'fields': ('phone', 'avatar', 'bio')}),
  10.     )
  11.    
  12. admin.site.register(CustomUser, CustomUserAdmin)
  13. # accounts/views.py
  14. from django.contrib.auth.models import Group
  15. from django.contrib.auth.decorators import user_passes_test
  16. @user_passes_test(lambda u: u.is_superuser)
  17. def manage_groups(request):
  18.     if request.method == 'POST':
  19.         # 创建新用户组
  20.         group_name = request.POST.get('group_name')
  21.         permissions = request.POST.getlist('permissions')
  22.         
  23.         group = Group.objects.create(name=group_name)
  24.         group.permissions.set(permissions)
  25.         
  26.         messages.success(request, f'用户组 {group_name} 创建成功')
  27.         return redirect('manage_groups')
  28.         
  29.     groups = Group.objects.all()
  30.     return render(request, 'accounts/manage_groups.html', {'groups': groups})
复制代码
五、认证流程图


六、自定义认证后端

6.1 创建自定义认证后端

  1. # accounts/auth_backends.py
  2. from django.contrib.auth.backends import ModelBackend
  3. from django.db.models import Q
  4. from .models import CustomUser
  5. class EmailOrPhoneBackend(ModelBackend):
  6.     def authenticate(self, request, username=None, password=None, **kwargs):
  7.         try:
  8.             # 通过邮箱或手机号查找用户
  9.             user = CustomUser.objects.get(
  10.                 Q(username=username) |
  11.                 Q(email=username) |
  12.                 Q(phone=username)
  13.             )
  14.             if user.check_password(password):
  15.                 return user
  16.             return None
  17.         except CustomUser.DoesNotExist:
  18.             return None
复制代码
6.2 配置认证后端

  1. # settings.py
  2. AUTHENTICATION_BACKENDS = [
  3.     'accounts.auth_backends.EmailOrPhoneBackend',
  4.     'django.contrib.auth.backends.ModelBackend',
  5. ]
复制代码
七、实用工具函数

  1. # accounts/utils.py
  2. from django.contrib.auth import get_user_model
  3. from django.contrib.auth.tokens import default_token_generator
  4. from django.core.mail import send_mail
  5. from django.template.loader import render_to_string
  6. from django.utils.encoding import force_bytes
  7. from django.utils.http import urlsafe_base64_encode
  8. User = get_user_model()
  9. def send_verification_email(user, request):
  10.     """
  11.     发送邮箱验证邮件
  12.     """
  13.     token = default_token_generator.make_token(user)
  14.     uid = urlsafe_base64_encode(force_bytes(user.pk))
  15.     verification_url = request.build_absolute_uri(
  16.         f'/accounts/verify/{uid}/{token}/'
  17.     )
  18.    
  19.     context = {
  20.         'user': user,
  21.         'verification_url': verification_url,
  22.     }
  23.    
  24.     message = render_to_string('accounts/email/verification.html', context)
  25.    
  26.     send_mail(
  27.         '验证您的邮箱',
  28.         message,
  29.         'noreply@example.com',
  30.         [user.email],
  31.         html_message=message,
  32.     )
  33. def get_user_permissions(user):
  34.     """
  35.     获取用户所有权限(包括组权限)
  36.     """
  37.     if user.is_superuser:
  38.         return User.objects.all().values_list('auth.permission__codename', flat=True)
  39.    
  40.     return user.user_permissions.values_list('codename', flat=True) | \
  41.            user.groups.values_list('permissions__codename', flat=True).distinct()
复制代码
八、最佳实践发起


  • 密码安全

    • 使用强密码策略
    • 实现密码过期机制
    • 记录密码修改汗青

  • 会话管理

    • 设置合适的会话超时时间
    • 实现"记着我"功能
    • 多设备登录控制

  • 权限计划

    • 最小权限原则
    • 合理分组
    • 定期审核权限

  • 安全防护

    • 实现登录尝试限定
    • 启用CSRF保护
    • 实现双因素认证

九、训练任务


  • 实现一个完整的用户认证系统,包罗:

    • 用户注册(带邮箱验证)
    • 登录(支持用户名/邮箱/手机号)
    • 找回密码
    • 修改个人信息

  • 创建一个权限管理系统:

    • 自定义权限
    • 用户组管理
    • 权限分配界面

  • 实现高级功能:

    • OAuth 2.0集成
    • JWT认证
    • API认证

十、总结

今天我们学习了Django认证系统的核心组件:

  • 用户认证基础知识
  • 权限系统的实现和使用
  • 用户组管理
  • 自定义认证系统

怎么样今天的内容还满意吗?再次感谢朋侪们的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

刘俊凯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表