当前位置: 首页 > 知识库问答 >
问题:

django1。11自定义身份验证后端问题--返回以/user/xxx开头的未知URL?

孟宏才
2023-03-14

我尝试使用Django 1.11中的自定义身份验证后端来构建函数(使用用户的电子邮件登录,而不是使用用户名的常规登录。用户名和用户电子邮件都保存在数据库中的同一个用户对象中)。

使用以下代码,我可以使用用户名(我在HTML表单的用户名空白中输入正确的用户名值)和密码成对成功登录。但反过来,当我使用HTML表单输入的电子邮件值时,它会在后台调试窗口中弹出错误,如下所示:

错误“未找到:/user/login/;
”POST/user/login/HTTP/1.1“404”

我很好奇,因为在我的整个URL中根本没有“用户/登录”。py和用户。意见。皮耶。它是怎么来的?

在寻求帮助之前,我查阅了Django官方文档(1.11版)和堆栈溢出中的其他建议性评论,但仍然没有正确的答案。

希望你的人救我出去,给我你的想法。

顺便说一下,我还检查了1.11 Django文档,它说"

Do not forget to test for the is_active attribute of the user in your own backend permission methods.

Changed in Django 1.10:
In older versions, the ModelBackend allowed inactive users to authenticate.

因此,我曾试图根据“is_acitve”检查来解决此错误,但不幸的是,我还没有将其修复。

--更新:在MySQL db中,我注意到当前用户对象有字段

(is_staff =1; is_active=1)

但我不知道如何使用这些信息来解决我目前的问题。

我在Pycharm IDE中运行它,Django1。11,py 3.6,mysql5。7(作为数据库保存用户表)

在背景中。哎呀,,

    

    AUTHENTICATION_BACKENDS = (
    # 'django.contrib.auth.backends.ModelBackend',
    'django.contrib.auth.backends.ModelBackend', 
    )

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'users',
        'courses',
        'organization',
        'operation',
        'xadmin',
        'crispy_forms',
        'DjangoUeditor',
    ]

    AUTH_USER_MODEL = "users.UserProfile"

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                    'django.template.context_processors.media',
                ],
            },
        },
    ]

    

在URL中。哎呀,,


    from django.conf.urls import url, include
    from django.contrib import admin
    from django.views.generic import TemplateView
    import xadmin
    from .settings import MEDIA_ROOT 
    from django.views.static import serve 
    from users. views import user_login

    urlpatterns = [
        url(r'^xadmin/', xadmin.site.urls),
        url(r'^media/(?P.*)$', serve, {"document_root": MEDIA_ROOT}), 
        url('^$', TemplateView.as_view(template_name='index.html'), name='index'),
        url('^login/$', user_login, name='login'),
    name='upload'),
    ]

在用户中。意见。哎呀,,


    from django.shortcuts import render
    from django.contrib.auth import authenticate, login
    from django.contrib.auth.backends import ModelBackend
    from django.db.models import Q

    from .models import UserProfile

    class CustomBackend(ModelBackend):
        def authenticate(self, request, username=None, password=None, **kwargs):
            try:
                user = UserProfile.objects.get(Q(username=username) | Q(email=username))
                if user.check_password(password):
                    return user
            except UserProfile.DoesNotExist as e:
                return None


    def user_login(request):
        if request.method == "POST":
            user_name = request.POST.get("username", "")
            pass_word = request.POST.get("password", "")
            user = authenticate(username=user_name, password=pass_word)
            if user is not None:
                login(request, user)
                return render(request, "index.html")
            else:
                return render(request, "login.html", {"msg": "name or password erro!"})
        elif request.method == "GET":
            return render(request, "login.html", {})

在登录中。html,

[

form action="/login/" method="post" id="jsLoginForm" autocomplete="off">
	input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
	div class="form-group marb20">
		label>your name</label>
		input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
	/div>
	div class="form-group marb8">
		label>your password</label>
		input name="password" id="password_l" type="password" placeholder="please input your password" />
	/div>
	div class="error btns login-form-tips" id="jsLoginTips">{{ msg }}</div>
	 div class="auto-box marb38">
		label><input type="checkbox" id="jsAutoLogin"> instant login </label>
		a class="fr" href="forgetpwd.html">forget your password?</a>
	 /div>
	 input class="btn btn-green" id="jsLoginBtn" type="submit" value="instant login > " />
 {% csrf_token %}
/form>

]

在理想的情况下,当我以超文本标记语言形式输入正确的用户电子邮件值和密码值后,也按下“登录”按钮,然后我假设我可以登录到index.html用户名和用户密码作为一对来进行认证。

共有1个答案

唐睿
2023-03-14

我猜,不确定这里会出什么问题,您的一个视图受到decorator或LoginRequiredMixin的保护,这可能配置为user/loginroute。

您还缺少一件事,将CustomBackend添加到您的身份验证\u后端

AUTHENTICATION_BACKENDS = (
    'your_app.views.CustomBackend',
    'django.contrib.auth.backends.ModelBackend', 
    )

同样在视图中,当登录成功时,不是呈现index.html,而是重定向到主页:

def user_login(request):
    if request.method == "POST":
        user_name = request.POST.get("username", "")
        pass_word = request.POST.get("password", "")
        user = authenticate(username=user_name, password=pass_word)
        if user is not None:
            login(request, user)
            return redirect(reverse('index'))
        else:
            return render(request, "login.html", {"msg": "name or password erro!"})
    elif request.method == "GET":
        return render(request, "login.html", {})

另外,更新login\u html,如下所示:

<form action="{% url 'login' %}" method="post" id="jsLoginForm" autocomplete="off">
 类似资料:
  • 我在Node.JS中使用AWS Cognito。 我正在成功注册和验证用户,但身份验证返回“未知错误,fetch的响应主体未定义” 我使用节点获取模块随着亚马逊-认知-身份-js(设置为var AWSCognito在下面的代码)。用户未处于需要更改密码并已验证的状态。 其他人是否经历过这种情况?您是如何解决此问题的?感谢您提前给予指导。。。。 这是我的代码,我的完整模块作为iditawsutils

  • 我正在将swagger应用于我的一个项目。 然后,他们应该在标头中随每次调用一起发送此令牌。 所以它就像: 看看swagger文档,它似乎只是为了处理OAuth而设置的。有没有办法让swagger以我的方式处理身份验证?我的意思是在生成的代码中。我可以为项目生成代码,它只有“Basic:...”作为选项。

  • 我试图在一个反应式Spring Boot应用程序中配置一个Spring Security性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建用户名密码身份验证令牌(身份验证),并手动进行身份验证。 但是,在执行此操作时,应用程序似乎无

  • 我想要自定义firebase身份验证,其中用户管理下级用户的角色。我需要指导,了解如何实现自己的后端身份验证系统。文档中到处都提到“将用户名和密码发送到后端以生成自定义令牌”。这个后端是什么?我在哪里追求这个?我的知识领域是firebase,firebase functions,angular 2/4,ionic2,用于本次讨论。。。谢谢

  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 问题内容: 我可以使用Google帐户在AppEngine中对用户进行身份验证的方式非常好。 但是,我需要使用 自定义的身份验证登录系统 。 我将有一个AppUsers表,其中包含用户名和加密密码。 我阅读了有关gae会话的内容,但在启动应用安全性方面需要帮助。 如何跟踪经过身份验证的用户会话?设置cookie? 初学者。 问题答案: 您可以使用cookie来做到这一点……其实并不难。您可以使用C