我已经为用户制作了自定义身份验证流程(不,我没有使用django的专用身份验证),我几乎完成了它,但仍然关注当时最重要的部分
所以这些是身份验证过程的主要部分:
logged
,其值为True。完成这些步骤后,会出现问题,当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的栏,它显示我的个人资料图片和分数。
答案 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
应用程序中得到解决,处理了许多已知的安全问题。