为加强Django Admin的安全性,可以添加验证码和多次登录尝试限制的实现。下面就详细介绍这个过程,包括以下步骤:
- 安装所需依赖
在requirements.txt
文件中添加以下两个依赖:
django-simple-captcha==0.5.12
django-axes==5.9.0
通过pip安装依赖:pip install -r requirements.txt
- 配置Django Simple Captcha
在settings.py
文件中找到INSTALLED_APPS
,添加captcha
和axes
:
INSTALLED_APPS = [
...
'captcha',
'axes',
...
]
在settings.py
文件的最后添加以下内容:
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
CAPTCHA_LENGTH = 4
CAPTCHA_FONT_SIZE = 24
CAPTCHA_FONT_PATH = 'fonts/Monospace.ttf'
CAPTCHA_FOREGROUND_COLOR = '#333333'
AXES_LOGIN_FAILURE_LIMIT = 5
AXES_LOCK_OUT_AT_FAILURE = True
AXES_COOLOFF_TIME = timedelta(minutes=15)
- 配置Django Axes
在settings.py
文件中添加以下配置项:
MIDDLEWARE = [
...
'axes.middleware.AxesMiddleware',
...
]
AXES_PROXY_COUNT = 2
AXES_BEHIND_REVERSE_PROXY = False
AXES_VERBOSE = True
AXES_FAILURE_LIMIT = 3
AXES_USE_USER_AGENT = True
AXES_LOCKOUT_TEMPLATE = 'lockout.html'
- 配置Django Admin
在urls.py
文件中找到urlpatterns
,添加以下代码:
from django.urls import reverse_lazy
from django.contrib.auth.views import LoginView
from captcha.fields import CaptchaField
class CaptchaLoginView(LoginView):
template_name = 'admin/login.html'
form_class = AuthenticationForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['captcha'] = CaptchaField()
return context
urlpatterns = [
path('admin/login/', CaptchaLoginView.as_view(), name='login'),
path('admin/', admin.site.urls),
]
- 创建模版文件
在admin
文件夹下创建login.html
文件,添加以下内容:
{% extends "admin/login.html" %}
{% block form_bottom %}
{{ captcha }}
{% endblock %}
- 运行测试
启动Django服务并尝试登录Django Admin,可以发现验证码和多次登录尝试限制都已经生效。
示例1:多次登录尝试限制
假设AXES_LOGIN_FAILURE_LIMIT配置项为5,用户在5次登录尝试失败后就会被锁定。尝试登录失败5次后,再次尝试登录会提示“Account locked: too many login attempts. Please try again in 900 second(s).”
示例2:验证码验证
如果用户尝试登录次数没有达到限制,但是没有输入正确的验证码,尝试登录会显示“Invalid Verification Code”。此时必须重新输入验证码才能继续登录尝试。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:给Django Admin添加验证码和多次登录尝试限制的实现 - Python技术站