使用AbstractUser后Django部署环境Admin表单CSRF验证失败及密码哈希异常
问题解决方案
一、部署后Admin路由重定向+CSRF验证403错误
针对Azure部署的Django应用出现的CSRF 403和重定向问题,按以下步骤排查修复:
- 添加代理SSL头配置:Azure应用服务通过反向代理转发请求,Django需识别HTTPS请求,在
settings.py中添加:SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') - 开启安全Cookie:生产环境HTTPS下必须设置以下参数,确保CSRF和Session Cookie仅通过HTTPS传输:
CSRF_COOKIE_SECURE = True SESSION_COOKIE_SECURE = True - 强制HTTPS重定向:设置
SECURE_SSL_REDIRECT = True,避免HTTP请求导致的混合内容或重定向异常:SECURE_SSL_REDIRECT = True - 确认
CSRF_TRUSTED_ORIGINS覆盖所有可能的域名:如果应用有备用域名(如带www前缀),需一并添加,示例:CSRF_TRUSTED_ORIGINS = ['https://rallys.azurewebsites.net', 'https://www.rallys.azurewebsites.net']
二、本地Admin面板用户密码未哈希问题
除CLI创建的超级用户外,其他用户密码不哈希,是因为自定义User模型未正确配置Admin管理类导致的,修复方法:
- 在应用的
admin.py中继承UserAdmin并注册自定义User模型,确保Admin表单自动处理密码哈希:from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import User class CustomUserAdmin(UserAdmin): model = User # 自定义添加用户的字段集,包含密码确认字段 add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('username', 'email', 'password1', 'password2', 'is_staff', 'is_superuser'), }), ) # 若需自定义编辑用户的字段集,可继续配置fieldsets admin.site.register(User, CustomUserAdmin) - 检查自定义User模型的
save方法:如果重写了save方法,确保密码字段通过set_password()处理后再保存,示例:from django.contrib.auth.models import AbstractUser class User(AbstractUser): # 你的自定义字段 def save(self, *args, **kwargs): # 仅当密码未哈希时进行处理 if self.password and not self.password.startswith(('pbkdf2_sha256$', 'argon2$', 'bcrypt$')): self.set_password(self.password) super().save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者Harsha Reddy
相关产品推荐
相关产品推荐

