Django登录/会话不依赖于HTTPS

时间:2013-07-15 17:00:20

标签: django apache login https

我正在使用mod_wsgi在Apache服务器上托管的Django站点上工作。 该网站仅在https上,因为我们将Apache的任何http请求重定向到https。

我正在研究的项目名为Skittle。 我有一个名为SkittleUser的自定义用户模型,它继承自AbstractBaseUser,并在settings.py文件中设置为AUTH_USER_MODEL。

os.environ ['HTTPS'] =“on”在wsgi.py文件中设置。

SESSION_COOKIE_SECURE = True且CSRF_COOKIE_SECURE = True都在settings.py中设置

我们现在遇到的问题是以用户身份登录是不可靠的。 当你进入登录页面时,有时它会起作用,而有时却不起作用。 然后在浏览网站时,您将突然失去会话并被踢到匿名用户。

如果有人想看一下,我们目前正在这里运行我们的测试网站: https://skittle.newlinetechnicalinnovations.com/discover/
我们的生产站点位于www.dnaskittle.com,但尚未合并用户登录,因为该功能不起作用。

测试用户: 电子邮件:test@dnaskittle.com 密码:asdf

如果登录不起作用,您将在右上角的“欢迎,登录”中看到,在这种情况下,只需尝试再次单击“登录”并使用相同的凭据。 在您真正登录之前,可能需要5-6次执行该过程。

当您看到“欢迎测试员,退出,我的基因组”

时,您会知道它有效

登录后,它可能会坚持一段时间,但浏览其他页面最终会让您退缩。 在这种情况发生之前,您没有一致的页面数量,并且不会在任何特定页面上发生。

对此的任何见解将不胜感激。

另外值得注意的是,进入Django管理页面(这不是我们的代码,但是基础django代码)也存在同样的问题。

3 个答案:

答案 0 :(得分:0)

SSL系统更长,更复杂。要使用https正确处理会话/登录,您可以使用session_cookies设置配置。

<强> settings.py:

ENABLE_SSL=False #in the debug mode in the production passed it to True
MIDDLEWARE_CLASSES = (
    'commerce.SSLMiddleware.SSLRedirect', #)
# the session here is to use in your views when a user is connected
SESSION_COKIE_NAME='sessionid'
#the module to store sessions data
SESSION_ENGINE='django.contrib.sessions.backends.db'    
#age of cookie in seconds (default: 2 weeks)
SESSION_COOKIE_AGE=7776000 # the number of seconds in 90 days
#whether a user's session cookie expires when the web browser is closed
SESSION_EXPIRE_AT_BROWSER_CLOSE=False
#whether the session cookie should be secure (https:// only)
SESSION_COOKIE_SECURE=False    

SSLMiddleware是您要在项目中定义的文件,如。

<强> SSLMiddleware.py:

from django.conf import settings
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect

SSL='SSL'

class SSLRedirect:
def process_view(self,request,view_func,view_args,view_kwargs):
    if SSL in view_kwargs:
        secure =view_kwargs[SSL]
        del view_kwargs[SSL]
    else:
        secure=False
    if not secure == self._is_secure(request):
        return self._redirect(request,secure)

def _is_secure(self,request):
   if request.is_secure():
       return True
   if 'HTTP_X_FORWARD_SSL' in request.META:
       return request.META['HTTP_X_FORWARD_SSL'] == 'on'
   return False

def _redirect(self,request,secure):
    protocol = secure and "https" or "http"
    newurl ="%s://%s%s" % (protocol, request, request.get_full_path())
    if settings.DEBUG and request.method=="POST":
        raise RuntimeError, \
    return HttpResponsePermanentRedirect(newurl)

现在在你的网址中应该处理你的登录或连接添加行

<强> urls.py:

from project import settings
urlpatterns += patterns('django.contrib.auth.views',
    (r'^login/$','login',{'template_name':'registration/login.html','SSL':settings.ENABLE_SSL},'login'),

尝试将此修改为您的代码。并且不要忘记将ENABLE_SSL转为True

答案 1 :(得分:0)

我已经解决了这个问题。 使用列出的设置时,用户无法使用HTTPS登录。

我做了什么:

在settings.py中添加:

SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_NAME = 'DNASkittle'

我还擦除了当前的django_sessions数据库,以防导致旧的延迟数据出现问题。

我没有设置额外的中间件或SSLRedirect,而且一切都工作正常。

答案 2 :(得分:0)

好的。对于使用HTTPS登录的用户,您必须启用SSL并使用适合您案例的代码才能使用它。 对于用户会话,您也可以使用它:

首先检查你是否有settings.py:     INSTALLED_APPS =('django.contrib.sessions',)

并在file.py中使用request.sessions:     request.session ['id'] ='the_id_to_store_in_browser'或'other_thing' 在这里你使用request.session就像一个特殊的SessionStore类,类似于python字典。

并在views.py中,例如在呈现模板或使用代码重定向测试cookie之前:     如果:      # 任何你想要的       if request.session.test_cookie_worked():         request.session.delete_test_cookie()       返回HttpResponseRedirect(最新的)     其他:      # 任何你想要的      request.session.set_test_cookie()     回报你想要的东西

使用此代码,用户会话将会变宽,取决于您的SESSION_COOKIE_AGE期间。