2010-11-08 45 views
2

J'ai un modèle Django qui ressemble à ceci:Obfuscated Django URL pour les objets modèle

class Person(models.Model): 

    name = models.CharField(max_length=32) 
    place = models.ForeignKey(Place, related_name='people') 
    approved = models.BooleanField() 
    objects = PersonManager() 

    @models.permalink 
    def get_absolute_url(self): 
     return('deal_details',(), { 
      'person_slug': slugify(self.name), 
     }) 

Comme vous pouvez le voir, j'ai déjà une URL absolue pour l'objet. Cependant, je veux créer une URL difficile à deviner pour suivre le processus d'approbation de l'objet. Quelqu'un at-il fait quelque chose de similaire et/ou avez-vous des suggestions sur la façon dont je devrais procéder?

Ma première pensée était la création d'un champ de modèle comme obfuscated_key qui est généré de manière aléatoire via le save function of the model. L'URL ressemblerait alors à /people/status/<id>/<obfuscated_key>/. Mais peut-être y a-t-il une meilleure façon de s'y prendre?

+0

Soit vous soucier de la sécurité dans ce cas et devrait utilisez des connexions réelles, ou vous ne pouvez pas et pouvez passer l'étape d'obscurcissement. L'un ou l'autre chemin est supérieur à la sécurité par l'obscurité. Si vous voulez vraiment prétendre que c'est utile, vous pouvez utiliser un hachage de la chose que vous essayez de cacher. – nmichaels

+0

@Nathon: Contournement de l'attitude --- "vouloir faire semblant que c'est utile" semble augmentative et prétentieuse pour moi --- Je crois que vous faites un bon point. Merci sincèrement. Infiniment reconnaissant. Ce type d'obfuscation est généralement utilisé pour les pages de courte durée de vie telles que les réinitialisations de mot de passe. Peut-être devrais-je repenser si cela correspond à mon objectif. Appréciez votre contribution. –

+0

@Nathon: Quelle est la différence entre un hash aléatoire et login + mot de passe? Si quelqu'un devine ou intercepte l'un d'entre eux, vous avez terminé de toute façon. –

Répondre

4

Une bonne façon de le faire serait de hachage ID de l'objet avec la clé secrète de l'installation (de settings.py). C'est ce que fait le formulaire de réinitialisation de mot de passe - il y a un code utile dans django.contrib.auth.tokens - et, dans les toutes dernières versions SVN, django.contrib.auth.crypto.

+0

+1 Super suggestion! Merci M. Roseman! –

0

J'ai utilisé UUIDField pour faire quelque chose de similaire.

Dans le modèle:

uuid = UUIDField(auto=True) 

puis dans la vue vérifier ce dernier et UUID:

item = get_object_or_404(Item, id=id, uuid__exact=uuid) 

Le UUIDField est de http://djangosnippets.org/snippets/335/