2010-11-08 68 views
2

我有一个Django的模型,看起来是这样的:混淆后的Django网址为模型对象

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), 
     }) 

正如你可以看到,我已经有对象的绝对URL。但是,我想创建一个难以猜测的URL来跟踪对象的审批流程。任何人做了类似的事情和/或对我应该如何着手有任何建议?

我的第一个想法是创建一个模型字段,如obfuscated_key,它是通过save function of the model随机生成的。然后该网址看起来像/people/status/<id>/<obfuscated_key>/。但也许有更好的方法来解决这个问题?

+0

要么你在这种情况下,对安全性和应使用真正的登录,或者你不能,也可以跳过混淆步骤。无论哪种方式都比默默无闻地优于安全。如果你真的想假装它是有用的,你可以使用你试图隐藏的东西的散列。 – nmichaels 2010-11-08 19:48:53

+0

@Nathon:绕过这种态度---“想要假装它是有用的”听起来对我来说是一种增强和缺点 - 我相信你能说得很好。真诚的谢谢你。多谢。这种混淆通常用于短期寿命页面,如密码重置。也许我应该重新思考它是否符合我的目的。感谢您的意见。 – 2010-11-08 20:41:43

+0

@Nathon:一些随机散列和登录+密码有什么区别?如果有人猜测或拦截他们中的任何一个,无论如何你都完成了。 – 2010-11-08 23:47:28

回答

4

一个好办法做到这一点是与安装的密钥(从settings.py)哈希对象的ID。这就是密码重置电子邮件表单所做的 - 在django.contrib.auth.tokens中有一些有用的代码 - 在最新的SVN版本中,django.contrib.auth.crypto

+0

+1真棒建议!谢谢罗斯曼先生! – 2010-11-08 23:54:27

0

我用UUIDField做类似的事情。

在模型:

uuid = UUIDField(auto=True) 

然后在视图中检查id和UUID:

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

的UUIDField为http://djangosnippets.org/snippets/335/