Django:跟踪和显示用户数据的策略

时间:2016-06-30 10:01:52

标签: python django authentication

详细

我已经为用户制作了自定义身份验证流程(不,我没有使用django的专用身份验证),我几乎完成了它,但仍然关注当时最重要的部分

所以这些是身份验证过程的主要部分:

  1. 用户通过Steam社交认证登录网站。
  2. 我的身份验证系统会检查数据库是否包含用户的数据,否则会创建一个包含所有信息的新用户对象。
  3. 系统会将Cookie创建为密钥logged,其值为True。
  4. 完成这些步骤后,会出现问题,当from .models import User, IPs from django.http import HttpResponseRedirect, HttpResponse import steamapi def index(request, self): ip = request.META['HTTP_X_FORWARDED_FOR'] for search in IPs.objects.all(): if str(ip) in str(search): break user = ip.strip(ip) # model will contain ip address with username. e.g ( user 127.0.0.1 ), so i strip the ip else: username = steamapi.user.SteamUser(self.steamid) # i get steamid from different function which is not important. username = IPs(data=username + " " + ip) username.save() print request.COOKIES if request.COOKIES.get('logged'): return HttpResponse("User %s" + "is logged in" % username) else: response = HttpResponse("User is not logged in") response.set_cookie('logged', True) return response Cookie的值为True时,网站应向用户显示数据。

    策略和问题

    例如,让我们看看stackoverflow,正如我所看到的:当它的登录cookie被激活时,它会显示我的个人资料图片和我的分数。

    它是如何知道我是那个特定用户?

    通过Cookie

    如果我通过cookie跟踪用户数据,我知道这是一个非常糟糕的主意,因为它们非常容易更改。

    通过IP地址

    然后是第二种方式,用ip地址跟踪它们,我认为这不是一个好主意:

    if($role == 0){
    

    通过会话

    我不完全了解Django的会话(除了cookie),如果我使用django的缓存会话会不会很好?如果是这样的话?

    注意:我正在寻找适合我开始时的步骤的代码,因此代码示例非常棒。

    第一个策略是完全糟糕的想法,我认为第二个策略不是pythonic而不是一个好策略,第三个是我需要帮助的。

    一般问题:

    那么在网站上显示特定用户数据的最佳策略是什么?正如我提到的simillar到stackoverflow的栏,它显示我的个人资料图片和分数。

2 个答案:

答案 0 :(得分:2)

编写自己的auth系统是了解其工作原理的一个很好的方法,但你必须小心不要引入安全问题。 Django auth框架已经工作了10年左右,因此可以信任做正确的事情。

布鲁诺的回答是对的:你应该使用会话。通过在用户的计算机上设置具有随机值的cookie来进行会话。之后,浏览器在每个请求上发回该随机值,Django Session框架(中间件,IIRC)将随机字符串与Session实例(dict like object)匹配,并将其放入请求实例中。

如果您使用的是现代Django版本,并且出于任何原因想要坚持只使用Cookie,您可以查看新的Cookie based sessions。在内部,它签署了cookie(意味着没有其他人可以篡改它,即使它存储在用户的计算机上)。

答案 1 :(得分:1)

规范解决方案是使用sessions。 FWIW注意到你的所有问题都已经在Django的contrib.auth应用程序中得到解决,处理了许多已知的安全问题。