Python Django Admin使用save_model()加密更改(或保存)时某些字段的值
我目前有一个自定义用户模型,其中一些字段应该加密(数据端),但在Django Admin上,它们需要解密以显示实际数据,因此我有Python Django Admin使用save_model()加密更改(或保存)时某些字段的值,python,django,encryption,django-admin,Python,Django,Encryption,Django Admin,我目前有一个自定义用户模型,其中一些字段应该加密(数据端),但在Django Admin上,它们需要解密以显示实际数据,因此我有encrypt\u string()和decrypt\u string()函数来处理它 我的用户模型: class User(AbstractUser): uid = models.CharField( "uid", max_length=255, null=True, blank=True) nickname = mod
encrypt\u string()
和decrypt\u string()
函数来处理它
我的用户模型:
class User(AbstractUser):
uid = models.CharField(
"uid", max_length=255, null=True, blank=True)
nickname = models.CharField(
"Nickname", max_length=255, null=True, blank=True)
eth_address = models.CharField(
"Eth address", max_length=255, null=True, blank=True)
eth_private_key = models.CharField(
"Eth private key", max_length=255, null=True, blank=True)
evt_address = models.CharField(
"Evt address", max_length=255, null=True, blank=True)
evt_private_key = models.CharField(
"Evt private key", max_length=255, null=True, blank=True)
在进行任何类型的保存或编辑时,需要加密eth_地址、eth_私钥、evt_地址和evt_私钥
当前,当我的服务器从api请求时,它将创建一个默认用户(django rest framework的自定义身份验证类上的句柄):
existed\u user\u check=user.objects.filter(uid=uid.exists())
在我的Django Admin中,我在Admin.py中编写了以下代码来处理解密(在更改视图中显示数据时)和加密(在保存或编辑这4个字段时):
自定义UserAdminForm,以便我解密数据,以便管理员在进行编辑或检查时可以查看数据。
解密后的数据能够正确显示在更改视图上
当管理员在Django admin change视图上编辑字段时,save_model()将处理数据加密
我当前的问题:
注意事项:
这些字段中的数据是存在的,所以我只讨论django admin上的编辑对象部分
当我试图编辑任何字段并保存它(应该加密)时,该字段被加密并保存,但它下面的字段(它的实际加密数据)现在更改为它的实际数据(未加密)
在更改视图上编辑evt_地址并保存后
使用form=UserAdminForm
在UserAdminCustom上注释掉#form=UserAdminForm
,以便显示实际数据
我打印了getattr(self.instance,field)
以查看加载django admin change视图时的加密数据,并得到以下4个加密字段:
web_1 | eth_address : gAAAAABeAcoI08bH2fQqJboZFxg6xn5RCxdRopllS6fDeyRmsC3qzsTXo88NVYOb58eeX5IXQpxqcGhbLr8wRRoWSKQsX5vLbPPhmWqUiqf0XYQvdWUhhgYxxMwwqgEOwU2OtJfkZ0p6
web_1 | eth_private_key : gAAAAABeAcoIp1V9sKNnL-dO-fWH1W1oM7hbqky44aRLchmTtvckaaZdaKuXo1xIIozx3xl40Y2Ct3YAyCOfkJJranKgTNDcVhndYdu5-awOuYpPCJKkSSia7IP_gWjLE91Gh8vsGnkn1iEkrLaho2ff0vVHS1QgGaJxji5m7cwCk0tqSp2AIeA=
web_1 | evt_address : gAAAAABeAcoIM3rywSgAPL611WUoWLJ9mqIgUHhZn8KDQd9hi9xHzgRri0EkoS_yBvwQyzdH72RWJRsDCs38oF9P8HHW_wFDWQ==
web_1 | evt_private_key : 1814067
因此,在编辑evt_地址
值并保存后,我的evt_私钥
数据被更改为1814067
为什么会发生这种情况,我很困惑是什么原因造成的
希望有人能帮我你在错误的抽象层上做这件事 请按照本指南创建自定义Django字段,以便为您处理加密/解密:
或者只是使用一些现有的解决方案,比如:在多次尝试修改
保存(u model
函数后,我意识到表单的数据实际上来自用户管理表单
,因此为了能够修改django管理表单上的数据,我需要在保存之前从表单本身对其进行加密
class UserAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(UserAdminForm, self).__init__(*args, **kwargs)
for field in user_profile_encrypt_fields:
if getattr(self.instance, field) is not None:
try:
self.initial[field] = decrypt_string(getattr(self.instance, field))
except:
pass
def clean_eth_address(self):
if self.cleaned_data['eth_address'] is not None:
data = encrypt_string(self.cleaned_data['eth_address'])
else:
data = None
return data
def clean_eth_private_key(self):
if self.cleaned_data['eth_private_key'] is not None:
data = encrypt_string(self.cleaned_data['eth_private_key'])
else:
data = None
return data
def clean_evt_address(self):
if self.cleaned_data['evt_address'] is not None:
data = encrypt_string(self.cleaned_data['evt_address'])
else:
data = None
return data
def clean_evt_private_key(self):
if self.cleaned_data['evt_private_key'] is not None:
data = encrypt_string(self.cleaned_data['evt_private_key'])
else:
data = None
return data
现在,每当我在管理表单上进行更改时,它都会使用自定义模型字段进行加密,这是一个好主意,但这不是我想要的,因为将来我可能也会使用解密值。如果一个字段在django admin上被保存或更改,我还想更改它的值,这是一个我将在future@LinhNguyen这就是我的想法。自定义字段将与django admin一起工作,无需任何更改。我将在下一个项目中实现这一点,我只想为django admin不断变化的值提供一个解决方案(可能不是加密/解密方式,而是在保存时格式化某些字段)因为我计划在未来使用它,我在这方面取得了成功:django加密字段自2016年以来从未更新过。此外,它还使用了keychar,这是去润滑。
web_1 | eth_address : gAAAAABeAcoI08bH2fQqJboZFxg6xn5RCxdRopllS6fDeyRmsC3qzsTXo88NVYOb58eeX5IXQpxqcGhbLr8wRRoWSKQsX5vLbPPhmWqUiqf0XYQvdWUhhgYxxMwwqgEOwU2OtJfkZ0p6
web_1 | eth_private_key : gAAAAABeAcoIp1V9sKNnL-dO-fWH1W1oM7hbqky44aRLchmTtvckaaZdaKuXo1xIIozx3xl40Y2Ct3YAyCOfkJJranKgTNDcVhndYdu5-awOuYpPCJKkSSia7IP_gWjLE91Gh8vsGnkn1iEkrLaho2ff0vVHS1QgGaJxji5m7cwCk0tqSp2AIeA=
web_1 | evt_address : gAAAAABeAcoIM3rywSgAPL611WUoWLJ9mqIgUHhZn8KDQd9hi9xHzgRri0EkoS_yBvwQyzdH72RWJRsDCs38oF9P8HHW_wFDWQ==
web_1 | evt_private_key : 1814067
class UserAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(UserAdminForm, self).__init__(*args, **kwargs)
for field in user_profile_encrypt_fields:
if getattr(self.instance, field) is not None:
try:
self.initial[field] = decrypt_string(getattr(self.instance, field))
except:
pass
def clean_eth_address(self):
if self.cleaned_data['eth_address'] is not None:
data = encrypt_string(self.cleaned_data['eth_address'])
else:
data = None
return data
def clean_eth_private_key(self):
if self.cleaned_data['eth_private_key'] is not None:
data = encrypt_string(self.cleaned_data['eth_private_key'])
else:
data = None
return data
def clean_evt_address(self):
if self.cleaned_data['evt_address'] is not None:
data = encrypt_string(self.cleaned_data['evt_address'])
else:
data = None
return data
def clean_evt_private_key(self):
if self.cleaned_data['evt_private_key'] is not None:
data = encrypt_string(self.cleaned_data['evt_private_key'])
else:
data = None
return data