Django内置认证系统深度解析
认证系统概览
Django框架内置了一套完整的用户认证体系,无需从零搭建即可实现注册、登录、权限管理等核心功能。这套系统依托数据库表存储用户信息,其中auth_user是核心数据表。
启用认证功能前,需先完成数据库迁移:
python manage.py migrate执行后Django会自动生成多张关联表,auth_user表结构包含以下关键字段:
password:经哈希处理的密码密文last_login:最近一次登录时间戳is_superuser:超级管理员标识(布尔值)username:唯一用户名date_joined:账户创建时间
通过命令行工具可快速创建超级管理员:
python manage.py createsuperuser按提示依次输入用户名、邮箱(可选)、密码即可完成创建。
核心API使用
在视图层操作认证系统,需要导入以下模块:
from django.contrib.auth.models import User
from django.contrib import auth账户注册
创建普通用户应使用create_user方法,该方法会自动处理密码加密:
User.objects.create_user(
username=account_name,
password=secret_code
)会话管理
验证用户凭据并建立会话:
# 从请求中提取凭证
account = request.POST.get('account_name')
secret = request.POST.get('secret_code')
# 验证身份
person = auth.authenticate(
request,
username=account,
password=secret
)
if person:
# 将用户信息写入session,保持登录状态
auth.login(request, person)访问控制装饰器
login_required装饰器可保护视图,未登录用户会被重定向。支持两种配置方式:
视图层指定跳转地址:
from django.contrib.auth.decorators import login_required
@login_required(redirect_field_name='next', login_url='/signin/')
def dashboard(request):
return render(request, 'dashboard.html')全局统一配置(settings.py):
LOGIN_URL = '/signin/'配置后装饰器可简写为:
@login_required
def dashboard(request):
return render(request, 'dashboard.html')常用状态检测与操作
| 操作 | 代码示例 | 说明 |
|---|---|---|
| 检测登录状态 | request.user.is_authenticated | 返回布尔值 |
| 获取当前用户 | request.user | 未登录返回匿名用户实例 |
| 校验旧密码 | request.user.check_password(raw_password) | 需确保非匿名用户 |
| 更新密码 | request.user.set_password(new_password); request.user.save() | 修改后需显式保存 |
| 退出登录 | auth.logout(request) | 清除cookie与session |
自定义用户模型
内置auth_user表的字段往往无法满足实际业务,Django允许通过继承AbstractUser扩展用户模型。
定义扩展模型
from django.contrib.auth.models import AbstractUser
class MemberProfile(AbstractUser):
mobile = models.CharField(max_length=15, blank=True)
bio = models.TextField(max_length=500, blank=True)
birth_date = models.DateField(null=True, blank=True)注册自定义模型
在配置文件中指定认证模型(格式:应用名.模型名):
AUTH_USER_MODEL = 'accounts.MemberProfile'执行迁移前需确保:
- 若已生成默认认证表,需先清理历史迁移记录与数据库表
- 项目中所有对用户模型的引用均使用
get_user_model()或settings.AUTH_USER_MODEL