Django如何使用phpMyAdmin内已有的用户表实现身份验证登录
Django对接phpMyAdmin现有用户表实现身份验证方案
适配前提说明
Django默认使用自带的auth_user表完成身份校验,如果你在phpMyAdmin中提前创建了自定义用户表,需要调整认证逻辑适配已有表结构,才能正常完成登录校验。
具体实现步骤
1. 方案选择(二选一即可)
方案一:自定义用户模型适配现有表(可调整表结构时优先选)
- 在对应应用的
models.py中定义和phpMyAdmin用户表字段完全匹配的ORM模型:
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.db import models class CustomUser(AbstractBaseUser): # 下方字段需和你phpMyAdmin内用户表的字段名、类型、长度完全一致 username = models.CharField(max_length=150, unique=True) email = models.EmailField(unique=True) phone = models.CharField(max_length=11, blank=True) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) USERNAME_FIELD = 'username' # 登录时用作唯一校验的字段,用手机号登录就改成对应字段名 REQUIRED_FIELDS = ['email'] # 创建超级用户时的必填字段 class Meta: db_table = '你的phpMyAdmin用户表实际表名' # 必须填已有表名,禁止Django生成新表
- 在
settings.py中指定自定义用户模型:
AUTH_USER_MODEL = '你的应用名.CustomUser'
- 执行迁移命令,因为表已经提前创建,需要加fake参数避免Django尝试建表:
python manage.py makemigrations python manage.py migrate --fake-initial
方案二:自定义认证后端(完全不能修改现有表结构时用)
- 在应用目录下新建
auth_backend.py自定义认证逻辑:
from django.contrib.auth.backends import BaseBackend from django.contrib.auth.hashers import check_password from .models import YourUserModel # 替换为你对应现有用户表的ORM模型 class CustomAuthBackend(BaseBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: # 从已有用户表查询对应用户 user = YourUserModel.objects.get(username=username) # 密码校验:如果你的密码是自定义加密/明文存储,替换为对应的校验逻辑即可 if check_password(password, user.password) and user.is_active: return user except YourUserModel.DoesNotExist: return None def get_user(self, user_id): try: return YourUserModel.objects.get(pk=user_id) except YourUserModel.DoesNotExist: return None
- 在
settings.py中注册自定义认证后端:
AUTHENTICATION_BACKENDS = [ '你的应用名.auth_backend.CustomAuthBackend', # 不需要保留Django默认认证逻辑可删除下一行 'django.contrib.auth.backends.ModelBackend', ]
2. 登录逻辑验证
完成配置后可以用简易测试视图验证登录功能:
from django.contrib.auth import authenticate, login from django.http import JsonResponse def login_view(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user: login(request, user) return JsonResponse({'code':0, 'msg':'登录成功'}) return JsonResponse({'code':1, 'msg':'用户名或密码错误'})
注意:如果phpMyAdmin中的用户表存储的是明文密码,属于高危安全隐患,建议尽快批量加密为Django默认支持的加密格式,避免数据泄露风险。
相关配置参考截图




内容的提问来源于stack exchange,提问作者mohanraj nagaiyan
相关产品推荐
相关产品推荐

