【问题标题】:django-two-factor-auth can't access admin sitedjango-two-factor-auth 无法访问管理站点
【发布时间】:2018-07-14 00:29:27
【问题描述】:

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

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

当我输入正确的凭据时,页面会使用此 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 登录要求,然后添加了电话设备。没有运气。

【问题讨论】:

标签: django security two-factor-authentication


【解决方案1】:

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

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

【讨论】:

  • 更新缺失导入。谢谢你,彼得·塞格斯特罗姆。
【解决方案2】:

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

from django.http import HttpResponseRedirect

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

admin.site.__class__ = AdminSiteOTPRequiredMixinRedirSetup

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

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

【讨论】:

    【解决方案3】:

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

    django-two-factor-auth 默认使用 two_factor\admin.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
    

    【讨论】:

    • 我最近还对我的项目实施了两个因素身份验证,发现管理员登录消失了,并认为我搞砸了,所以重新开始,然后在此页面上查看解决方案。我想确认@schum 发布的这个解决方案完全符合我的要求 - 非常感谢!
    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2015-09-18
    • 1970-01-01
    • 2018-09-20
    • 2021-03-15
    • 2021-04-25
    相关资源
    最近更新 更多