Question

En fait, je dois utiliser le hachage de mot de passe de l'utilisateur pour chiffrer des données via un champ de modèle personnalisé. Consultez l'extrait je ici. Django cryptage

J'ai essayé ceci:

class MyClass(models.Model):
    owner = models.ForeignKey(User)
    product_id = EncryptedCharField(max_length=255, user_field=owner)

.................................................................................

    def formfield(self, **kwargs):
        defaults = {'max_length': self.max_length, 'user_field': self.user_field}
        defaults.update(kwargs)
        return super(EncryptedCharField, self).formfield(**defaults))

Mais quand j'essaie d'utiliser user_field, je reçois une instance ForeignKey (bien sûr!):

user_field = kwargs.get('user_field')
cipher = user_field.password[:32]

Toute aide est appréciée!

Était-ce utile?

La solution

peut-être quelque chose comme cela - remplacer la méthode save () où vous pouvez appeler la méthode Encrypt

.

pour Décrypter vous pouvez utiliser post_init , donc chaque fois que vous instancier le modèle à partir de la base de données du champ product_id est décrypté automatiquement

class MyClass(models.Model):
    user_field = models.ForeignKey(User)
    product_id = EncryptedCharField()
    ...other fields...

    def save(self):
        self.product_id._encrypt(product_id, self.user_field)
        super(MyClass,self).save()

    def decrypt(self):
        if self.product_id != None:
            user = self.user_field
            self.product_id._decrypt(user=user)

def post_init_handler(sender_class, model_instance):
    if isinstance(model_instance, MyClass):
        model_instance.decrypt()

from django.core.signals import post_init
post_init_connect.connect(post_init_handler)


obj = MyClass(user_field=request.user) 
#post_init will be fired but your decrypt method will have
#nothing to decrypt, so it won't garble your input
#you'll either have to remember not to pass value of crypted fields 
#with the constructor, or enforce it with either pre_init method 
#or carefully overriding __init__() method - 
#which is not recommended officially

#decrypt will do real decryption work when you load object form the database

obj.product_id = 'blah'
obj.save() #field will be encrypted

peut-être il y a un moyen « pythonique » plus élégante de le faire

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top