我们的DjangoCMS网站可通过http和https访问。
通过http匿名使用是可以的。但我想通过http禁用登录。
有没有办法在用户想要登录时强制使用https?
即使是登录页面(包含用户名和密码字段)也不应通过http。
提供背景:我不希望密码通过未加密的电线。
更新:该网站托管在Apache网络服务器上。
答案 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)
您可以使用以下一种或多种组合: