2013-07-15 62 views
0

我正在使用mod_wsgi在Apache服务器上托管Django站点。 该网站只在https上,因为我们有Apache将任何http请求重定向到https。Django登录/会话不支持HTTPS

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

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

SESSION_COOKIE_SECURE = True和CSRF_COOKIE_SECURE =真都在settings.py

,我们有,现在是登录作为用户是不可靠的问题设置。 当您进入登录页面时,有时可以工作,而有些时候则不可用。 然后在浏览网站时,您会突然失去会话并被踢向匿名用户。

我们目前在这里运行我们的测试网站,如果有人想看一看: https://skittle.newlinetechnicalinnovations.com/discover/
我们的生产基地是在www.dnaskittle.com但尚未纳入用户登录的功能不起作用。

测试用户: 电子邮件:[email protected] 密码:ASDF

如果登录不工作,你会在右上角看到“欢迎您,登录”在这种情况下,只是尝试一下再次登录并使用相同的凭据。 这可能需要做的是过程中你会真正得到登录前的5-6倍。

你会知道它的工作原理,当你看到“欢迎测试,退出,我的基因组”

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

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

另外值得注意的是,转到Django的管理页面(这不是我们的代码,但基本Django代码)具有相同的问题。

+0

只需要注意,当您终于登录后,当您被踢出几页后,它会在数据库中为您创建一个新会话。并且您以匿名用户身份登录。 –

回答

0

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

我做了什么:

settings.py中添加:

SESSION_SAVE_EVERY_REQUEST = True 
SESSION_COOKIE_NAME = 'DNASkittle' 

我也抹去的情况下,当前django_sessions数据库是造成老挥之不去的数据问题。

我没有设置额外的中间件或SSLRedirect,并且所有的东西都在工作状态。

+0

我有完全相同的问题。不幸的是,应用此解决方案对我无效。你能否解释为什么这应该有所帮助? – schacki

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) 

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

网址。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

+0

我在settings.py中添加了我缺少的项目。 ENABLE_SSL,cookie名称,会话引擎。我没有看到需要SSLRedirect,因为所有内容都已经通过apache转发到https。但是,我仍然可以登录该网站一次,然后随机在随后的几次导航中启动。 –

+0

好吧,对SSLRedirect的需求是在登录时确保用户密码传输,如果它真的对你很重要,它应该是安全的。现在,您必须在设置中设置Cookie,并在您的登录视图中使用它们,以便在您的架子或组织中定义的时间段内进行连接。使用您的views.py中的cookie来处理连接。它应该工作。 – drabo2005

+0

感谢您的意见,这确实让我们朝着正确的方向前进。 –

0

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

首先检查您是否已经在settings.py: INSTALLED_APPS =(“django.contrib.sessions”,)

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

,并在您views.py例如渲染一个模板或重定向测试与代码中的Cookie之前: 如果: #任何你想要的 如果request.session.test_cookie_worked(): request.session.delete_test_cookie( ) 返回HttpResponseRedirect(最多到你) 其他: #任何你想要的 request.session.set_test_cookie()返回 什么,你想

与此代码的用户会话将继续坚持一个广泛的,取决于你的SESSION_COOKIE_AGE时期。