DjangoCMS:通过http禁用登录,强制https

时间:2017-10-16 10:58:00

标签: django https django-cms

我们的DjangoCMS网站可通过http和https访问。

通过http匿名使用是可以的。但我想通过http禁用登录。

有没有办法在用户想要登录时强制使用https?

即使是登录页面(包含用户名和密码字段)也不应通过http。

提供

背景:我不希望密码通过未加密的电线。

更新:该网站托管在Apache网络服务器上。

6 个答案:

答案 0 :(得分:16)

正如我在评论中已经提到的那样,我强烈建议您仅通过https提供登录页面。

这样做只是隐藏了一个事实,例如,会话信息和身份验证数据仍然通过http未加密的其他请求进行转移。您的网站根本不安全。

你只是伪保护的东西,所以它看起来像某些人的眼睛。这就像使用密码12345

因此,请通过https向您的网站提供服务。有关如何将流量从http重定向到https的nginx或apache2小指南,请点击此处:

答案 1 :(得分:4)

正如您在评论中所接受的那样,将所有流量推送到HTTPS是最近的解决方案。如果您只通过SSL进行身份验证,那么您需要在所有向前编写的内容中考虑加密/安全性,而不仅仅是默认值。

因此,在您的服务器配置中,强制所有流量到443端口。假设您正在使用apache,那么就这样做了;

 <VirtualHost *:80>
     ServerName www.example.com
     Redirect / https://www.example.com/
 </VirtualHost>

 <VirtualHost *:443>
     ServerName www.example.com
     # ... SSL configuration goes here
 </VirtualHost>

然后在您的Django设置中打开安全cookie;

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

作为旁注,Django有一个设置可以将HTTP流量重定向到HTTPS SECURE_SSL_REDIRECT,但是如果您在apache / nginx级别执行此操作,则不必担心。有关SSL / HTTPS的进一步阅读,请查看此处; https://docs.djangoproject.com/en/1.11/topics/security/#ssl-https

答案 2 :(得分:3)

Django请求有一个is_secure()

您可以在视图中进行检查,如果不安全则可以重定向:

if not request.is_secure():
    return redirect("https://www.yourdomain.com/login")

答案 3 :(得分:3)

@ user1具有逻辑权限,您应该通过https为您的网站提供服务,以确保其安全。
但是为了回答你的确切问题:

如下所示:How to know using Django if server is secure (uses https)和@Zartch在他的回答中提及,您应该使用is_secure() HTTPRequest方法检查您的请求是否通过https发送。

  • 要使用is_secure(),您需要检查传入的请求 你的意见:

    def my_login_view(request):
        if request.is_secure():
            Do loggin
        else:
            Don't login
    
  • 现在,您可以使用login_required装饰器保护您的其他观看次数:

    @login_required(login_url='/your/login/url')
    def protected_view(request):
        ...
    

个人建议:我广泛使用Django Rest Framework,在您的情况下我会建议,因为它有一个isAuthenticatedOrReadOnly权限类,您会喜欢:

class MyLoginView(ObtainAuthToken):
    """
    Login view for token-based authentication
    """
    def post(self, request, *args, **kwargs):
        if request.is_secure():
            super().post(request, *args, **kwargs)
        else:
            Probably some redirect goes here...

然后在任何其他视图或基于类的视图中:

class MyOtherView(generics.GenericAPIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    ...

以上内容将确保您的用户只能通过https登录,如果他们没有登录,他们只能看到只读视图。

如果你愿意,试一试。

答案 4 :(得分:2)

你还没有接受答案,所以我想,答案可能与你的问题不符。

  

通过http匿名使用是可以的。但我想通过http禁用登录。

据我了解,您有以下用例:

有些人以匿名用户身份访问您的网站,使用的协议是http。 此人打开登录表单并登录,表单通过https发送。 登录用户继续通过https浏览您的网站。

如果登录表单被路由到安全版本,您的用户将继续以https模式浏览您的网站(只要所有其他链接与所使用的协议无关)。

<form action="https://your.domain/path/to/login/" method="post">

如果您用于对用户进行身份验证的应用程序是精心编写的,则可以配置settings.LOGIN_URL,否则您可能需要在模板表单中执行此操作。

我建议只允许使用settings.SESSION_COOKIE_SECURE通过https发送会话Cookie。 使用此设置,用户仍然可以发出http请求,但不会发送会话cookie(并且用户将被视为匿名用户)。

请确保您的登录视图仅接受安全的帖子请求(否则用户可以通过非https协议发送密码)。 这可以通过Django代码(如John Moutafis建议使用他的MyLoginView)或生产服务器级别通过拒绝登录URL的非https发布请求来实现。

-

您是否可以使用代码提供对存储库的访问权限?

答案 5 :(得分:0)

您可以使用以下一种或多种组合: