如何在自定义登录页集成django-two-factor-auth并自定义相关验证页面
普通用户双因子登录逻辑适配
你需要修改现有登录视图,在用户名密码验证通过后先判断用户是否开启了双因子认证,再走对应逻辑:
- 若用户未开启双因子:直接执行登录跳转
- 若用户已开启双因子:暂不执行全局登录,将用户临时信息存入session后跳转OTP校验页
修改后的login_view代码如下:
from django.shortcuts import redirect from django.contrib.auth import authenticate, login from django.contrib import messages def login_view(request): if request.user.is_authenticated: return redirect('blog:my-account') if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user is not None: # 判断用户是否开启双因子认证 if user.totpdevice_set.filter(confirmed=True).exists(): # 将验证通过的用户ID存入session,供OTP校验页使用 request.session['pre_otp_user_id'] = user.id # 跳转OTP验证页,url名称对应django-two-factor-auth的校验路由 return redirect('two_factor:login_token') else: # 未开启双因子直接登录 login(request, user) messages.add_message(request, messages.INFO, 'Login Sucessfull') return redirect('members:user-profile-private') # 原有GET请求的登录页渲染逻辑保持不变即可
注意:你需要确保django-two-factor-auth的OTP校验路由已经在urls.py中正确配置
urls.py配置示例:
from django.urls import path, include from . import views urlpatterns = [ path('login/', views.login_view, name='login'), # 引入django-two-factor-auth的路由,用于OTP校验 path('two-factor/', include('two_factor.urls', 'two_factor')), # 其他路由保持不变 ]
常见问题解答
1. 恢复Django默认后台登录页
django-two-factor-auth默认会覆盖Django admin的登录路由,只需要调整路由加载顺序即可解决:
- 将
path('admin/', admin.site.urls)的配置放到所有django-two-factor-auth相关路由的前面,Django路由按从上到下的优先级匹配,先匹配到admin原生路由就不会走双因子的覆盖路由 - 如果需要保留管理员账号必须走OTP校验的要求,可以单独给admin后台添加校验中间件,判断管理员用户是否完成双因子验证即可,不需要依赖默认的登录页覆盖逻辑
2. 自定义双因子认证登录HTML页面
完全支持自定义页面,django-two-factor-auth的所有模板都可以通过项目模板覆盖的方式修改:
- 在你项目的
templates目录下新建two_factor文件夹 - 从django-two-factor-auth的源码template目录中复制你需要修改的模板文件(比如登录页
core/login.html、OTP校验页core/login_token.html等)到刚才新建的two_factor目录下 - 直接修改复制后的模板文件的样式、结构即可,Django会优先加载你项目下的模板文件
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

