配置了多个身份验证后端,因此必须提供“backend”参数或在用户上设置“backend”属性。

35

首先我是一个新手,对于Django/Python不太熟悉。

我正在尝试创建一个登录网站,允许用户注册一个账户并通过电子邮件或直接通过FBGoogleOauth登录

当我点击发送到电子邮件的验证链接时,出现了错误。

错误信息:

ValueError at /activate/Mjk/4p1-dcc5f7ed2e7c847fe362/

You have multiple authentication backends configured and therefore must 

provide the `backend` argument or set the `backend` attribute on the user.

Request Method: GET

Request URL:    http://127.0.0.1:8000/activate/Mjk/4p1-dcc5f7ed2e7c847fe362/
Django Version: 1.11.3

Exception Type: ValueError

Exception Value:    

You have multiple authentication backends configured and therefore must provide the `backend` argument or set the `backend` attribute on the user.
Exception Location: /usr/local/lib/python2.7/dist-packages/django/contrib/auth/__init__.py in login, line 149
Python Executable:  /usr/bin/python
Python Version: 2.7.12
Python Path:    
['/home/gaby/django projects/simple-signup-master/profile-model',
 '/usr/local/lib/python2.7/dist-packages/virtualenv-15.1.0-py2.7.egg',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/home/gaby/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Server time:    Wed, 30 Aug 2017 12:34:31 +0000

我的网站/设置

AUTHENTICATION_BACKENDS = (

    
     'social_core.backends.facebook.FacebookOAuth2',
     'social_core.backends.google.GoogleOAuth2',

     'django.contrib.auth.backends.ModelBackend',
)

当我收到错误时被调用的函数

    def activate(request, uidb64, token):
    try:
    uid = force_text(urlsafe_base64_decode(uidb64))
    user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
    user = None

    if user is not None and account_activation_token.check_token(user, 
    token):
    user.is_active = True
    user.profile.email_confirmed = True
    user.save()
    login(request, user)
    return redirect('home')
else:
    return render(request, 'account_activation_invalid.html')

我在通过fbgoogle添加oath登录后开始收到error。如果我从AUTHENTICATION_BACKENDS移除'social_core.backends.facebook.FacebookOAuth2'和'social_core.backends.google.GoogleOAuth2',email confirmation将再次起作用。

我在网上搜索并在这里也找到了唯一的解决方案,但它没有解决我的问题。here

6个回答

50

我找到解决方法了。使用如下参数调用 login(): login(request, user, backend='django.contrib.auth.backends.ModelBackend')

以下是完整代码:

def activate(request, uidb64, token, backend='django.contrib.auth.backends.ModelBackend'):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None

    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.profile.email_confirmed = True
        user.save()
        login(request, user, backend='django.contrib.auth.backends.ModelBackend')
        return redirect('home')
    else:
        return render(request, 'account_activation_invalid.html')

2
在我的情况下,在调用登录方法之前,我必须对用户进行身份验证。 - jartaud

12

所以在我的情况下,我只是没有注册该用户。同时执行了login(request, user, backend='django.contrib.auth.backends.ModelBackend')

要注册用户:

# register.py
from django.contrib.auth.models import User
cfg_user = 'user'
user = User.objects.create_user(username=cfg_user,
                                 email='email@domain.com',
                                 password='password')
print('registered user '+cfg_user)

# register.sh
python manage.py shell < register.py

2
如果您正在使用内置的Django类PasswordResetConfirmView,则可以通过添加以下内容来修复它:

如果您正在使用内置的Django类PasswordResetConfirmView,则可以通过添加以下内容来修复它:
post_reset_login_backend = "django.contrib.auth.backends.RemoteUserBackend"

最初的回答就像这样:

类似这样:

from django.contrib.auth import views

class PasswordResetConfirmView(views.PasswordResetConfirmView):
    template_name = "reset_confirm.html"
    success_url = "/"
    post_reset_login = True
    post_reset_login_backend = "django.contrib.auth.backends.RemoteUserBackend"

1
如果您在settings.py中设置了多个身份验证后端,如下所示:
# "core/settings.py"

AUTHENTICATION_BACKENDS = [
    "django.contrib.auth.backends.ModelBackend",
    "graphql_jwt.backends.JSONWebTokenBackend",
]

您需要在views.py中的login()函数中设置backend='django.contrib.auth.backends.ModelBackend',如下所示,然后错误就会被解决:

# "account/views.py"

from django.shortcuts import render, redirect
from .forms import NewUserForm
from django.contrib.auth import login
from django.contrib import messages

def register_request(request):
    if request.method == "POST":
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()   # Here
            login(request, user, backend='django.contrib.auth.backends.ModelBackend')
            messages.success(request, "Registration successful.")
            return redirect("account:homepage")
        messages.error(request, "Unsuccessful registration. Invalid information.")
    form = NewUserForm()
    return render(request, "account/register.html", {"register_form":form})

此外,当我在views.py中的login()方法中将backend='graphql_jwt.backends.JSONWebTokenBackend'设置为如下所示时,我的问题也得到了解决。因此,如果您设置了多个身份验证后端之一,可能也可以解决该错误:

# "account/views.py"

from django.shortcuts import render, redirect
from .forms import NewUserForm
from django.contrib.auth import login
from django.contrib import messages

def register_request(request):
    if request.method == "POST":
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()   # Here
            login(request, user, backend='graphql_jwt.backends.JSONWebTokenBackend')
            messages.success(request, "Registration successful." )
            return redirect("account:homepage")
        messages.error(request, "Unsuccessful registration. Invalid information.")
    form = NewUserForm()
    return render(request, "account/register.html", {"register_form":form})

如果你仅将"django.contrib.auth.backends.ModelBackend"设置为AUTHENTICATION_BACKENDS,如下所示:

# "core/settings.py"

AUTHENTICATION_BACKENDS = [
    "django.contrib.auth.backends.ModelBackend",
]

或者,如果您没有在 settings.py 中明确设置 AUTHENTICATION_BACKENDS,如下所示:

# "core/settings.py"

# AUTHENTICATION_BACKENDS = [
#     "django.contrib.auth.backends.ModelBackend",
# ]

views.py中,您不需要设置backend='django.contrib.auth.backends.ModelBackend'login(),因为"django.contrib.auth.backends.ModelBackend"会自动设置。请注意保留HTML标签。

0
此处所建议,您需要设置用户记录的后端。在login(request, user)之前添加以下行:
user.backend = 'django.contrib.auth.backends.ModelBackend'
...
login(request, user)

0
在我的情况下,只需将 Django 配置中的一些后端类分配给用户即可正常工作:
setattr(user,'backend','django.contrib.auth.backends.RemoteUserBackend')
然后您就可以对用户进行身份验证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接