0

我正在使用 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 代码)有同样的问题。

4

3 回答 3

0

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

设置.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

于 2013-07-15T18:32:26.017 回答
0

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

我做了什么:

在 settings.py 中添加:

SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_NAME = 'DNASkittle'

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

我没有设置额外的中间件或 SSLRedirect,一切正常。

于 2013-07-25T17:43:30.063 回答
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 : # 不管你想要什么 if request.session.test_cookie_worked(): request.session.delete_test_cookie() you) else: # 随便你 request.session.set_test_cookie() return what-you-want

使用此代码,用户会话将持续很长时间,具体取决于您的 SESSION_COOKIE_AGE 期间。

于 2013-07-27T05:10:47.530 回答