django-two-factor-auth 无法访问管理站点

问题描述 投票:0回答:4

我正在将 django-two-factor-auth 用于网络应用程序。我无法访问管理页面。

我知道我输入了正确的凭据。当我输入不正确的凭据时,我会收到相应的错误消息。

当我输入正确的凭据时,页面只需使用以下 URL 重新加载:

http://localhost:8080/account/login/?next=/inveskore/

这些是我与two_factor相关的设置:

LOGIN_URL = 'two_factor:login'
LOGIN_REDIRECT_URL = '/inveskore'
TWO_FACTOR_SMS_GATEWAY = 'two_factor.gateways.twilio.gateway.Twilio'

这是关联的 URL 路径:

path('admin/', admin.site.urls),

根据this,这是由于管理员用户没有设置2FA造成的。

那么,如果您无法访问该网站,如何为管理员用户设置 2FA?

编辑:

我删除了网站的 2FA 登录要求,然后添加了电话设备。没有运气。

python django django-admin two-factor-authentication django-two-factor-auth
4个回答
3
投票

我最近遇到了这种情况,并根据那里的评论创建了这个解决方案:

https://github.com/Bouke/django-two-factor-auth/issues/219#issuecomment-494382380

我对

AdminSiteOTPRequired
进行了子类化,然后将其指定为要使用的管理类

from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.views import redirect_to_login
from django.http import HttpResponseRedirect
from django.shortcuts import resolve_url
from django.urls import reverse
from django.utils.http import is_safe_url
from two_factor.admin import AdminSiteOTPRequired, AdminSiteOTPRequiredMixin


class AdminSiteOTPRequiredMixinRedirSetup(AdminSiteOTPRequired):
    def login(self, request, extra_context=None):
        redirect_to = request.POST.get(
            REDIRECT_FIELD_NAME, request.GET.get(REDIRECT_FIELD_NAME)
        )
        # For users not yet verified the AdminSiteOTPRequired.has_permission
        # will fail. So use the standard admin has_permission check:
        # (is_active and is_staff) and then check for verification.
        # Go to index if they pass, otherwise make them setup OTP device.
        if request.method == "GET" and super(
            AdminSiteOTPRequiredMixin, self
        ).has_permission(request):
            # Already logged-in and verified by OTP
            if request.user.is_verified():
                # User has permission
                index_path = reverse("admin:index", current_app=self.name)
            else:
                # User has permission but no OTP set:
                index_path = reverse("two_factor:setup", current_app=self.name)
            return HttpResponseRedirect(index_path)

        if not redirect_to or not is_safe_url(
            url=redirect_to, allowed_hosts=[request.get_host()]
        ):
            redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)

        return redirect_to_login(redirect_to)

然后在

urls.py

from django.contrib import admin
admin.site.__class__ = AdminSiteOTPRequiredMixinRedirSetup

1
投票

我还不能发表评论,但 @saschwarz 的上述答案对于 Django 2.2 和 django-two-factor-auth 来说就像一个魅力。他的代码中唯一缺少的是额外的导入:

from django.http import HttpResponseRedirect

之后我就可以使用这条线了:

admin.site.__class__ = AdminSiteOTPRequiredMixinRedirSetup

为管理员用户快速实施两个因素。

django-two-factor-auth 的文档中确实缺少这一点...我查看了文档很长一段时间,但找不到生成二维码的明确方法。它仅在演示应用程序中真正演示,而不是以非常模块化的方式。


1
投票

saschewarz 的解决方案没有解决我的应用程序中的问题。 所以我找到了另一个显示标准管理员登录的地方。

django-two-factor-auth 默认使用two_factor dmin.py 中的“patch_admin”函数修补您的管理网址,以便您始终会看到管理员登录的标准站点登录信息。

要解决这个问题,你可以注释掉

two_factor\admin.py

中的 2 个函数
def patch_admin()

def unpatch_admin()

并在

two_factor\apps.py

中注释掉
def ready(self) 

要在管理站点中使用两因素身份验证,请在主

urls.py
(其中是管理路径)中添加此代码:

from django_otp.admin import OTPAdminSite
admin.site.__class__ = OTPAdminSite

0
投票

如果您只使用 Django Admin 而没有 Django 网站,请将下面的 LOGIN_REDIRECT_URL 设置为

settings.py

# "settings.py"

LOGIN_REDIRECT_URL = 'admin:index' # Or

LOGIN_REDIRECT_URL = '/admin' # Or
© www.soinside.com 2019 - 2024. All rights reserved.