使用admin管理自定义的用户表,添加用户时怎么对密码进行md5加密后再保存呢?这里默认没有加密。
要对Django的用户密码进行MD5加密,可以使用Django提供的密码哈希工具。在您的Django应用程序中,您需要首先导入密码哈希器,然后重写用户模型的保存方法以使用密码哈希器进行密码哈希。下面是一个示例代码:
python
Copy code
import hashlib
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.hashers import make_password
class CustomUser(AbstractUser):
def save(self, *args, **kwargs):
if not self.id:
self.password = make_password(hashlib.md5(self.password.encode('utf-8')).hexdigest())
super(CustomUser, self).save(*args, **kwargs)
在这个示例中,我们导入了Python的hashlib库以及Django提供的make_password函数。我们使用hashlib库的md5函数来对用户的密码进行MD5哈希,并使用make_password函数将哈希后的密码转换为Django支持的格式。最后,我们调用父类的save方法来保存用户对象。
请注意,由于Django已经提供了安全的密码哈希工具,所以在使用自定义哈希算法之前,请确保您真正需要使用它。此外,对于生产环境,建议使用更强大的哈希算法(如bcrypt),以确保密码安全性。
答案:
在Django的admin后台管理系统中对用户密码进行加密保存,需要对默认的User模型进行扩展。具体的步骤如下:
在新的应用中创建models.py文件,在该文件中定义一个新的User模型,并继承Django自带的AbstractBaseUser和PermissionsMixin。
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
class MyUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=30, unique=True)
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
def __str__(self):
return self.username
在新的应用中创建managers.py文件,并定义一个新的UserManager。
from django.contrib.auth.models import BaseUserManager
class UserManager(BaseUserManager):
def _create_user(self, username, password, email, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, username, password=None, email=None, **extra_fields):
extra_fields.setdefault('is_superuser', False)
return self._create_user(username, password, email, **extra_fields)
def create_superuser(self, username, password=None, email=None, **extra_fields):
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True')
return self._create_user(username, password, email, **extra_fields)
在新的User模型中添加objects = UserManager(),以便使用新的UserManager创建用户。
class MyUser(AbstractBaseUser, PermissionsMixin):
...
objects = UserManager()
在新的应用中创建admin.py文件,并导入MyUser和UserAdmin,将MyUser注册到admin后台管理系统中。
from django.contrib.auth.admin import UserAdmin
from .models import MyUser
admin.site.register(MyUser, UserAdmin)
这样就可以在admin后台管理系统中使用MyUser模型了,并对用户密码进行加密保存。
注:在上述代码中,使用了Django自带的set_password方法对密码进行加密保存。如果需要使用md5加密,可以在UserManager中重写_password方法即可。具体代码如下:
import hashlib
from django.contrib.auth.models import BaseUserManager
class UserManager(BaseUserManager):
def _create_user(self, username, password, email, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.password = self._password(md5, password) # 密码加密
user.save(using=self._db)
return user
def _password(self, method, password):
return getattr(hashlib, method)(password).hexdigest()
def create_user(self, username, password=None, email=None, **extra_fields):
extra_fields.setdefault('is_superuser', False)
return self._create_user(username, password, email, **extra_fields)
def create_superuser(self, username, password=None, email=None, **extra_fields):
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True')
return self._create_user(username, password, email, **extra_fields)