【问题标题】:how do i set my authentication backend as default in settings.py file of my django project(Extended AbstractBaseUser model)如何在我的 django 项目的 settings.py 文件中将我的身份验证后端设置为默认值(扩展 AbstractBaseUser 模型)
【发布时间】:2021-05-29 12:12:07
【问题描述】:

我为 Auth Backend 编写了以下类,并将其放在 app 目录内的文件“authentication.py”中:

from events.models import User

class authBackend():
    def authenticate(self, request, username, passwprd):
        try:
            user = User.objects.get(rollNo=username)
            success = user.check_password(password)
            if success:
                return user
        except User.DoesNotExist:
            pass
        return None

    def get_user(self, uid):
        try:
            return User.objects.get(pk=Uid)
        except:
            return None

然后我添加(或者至少我认为我这样做了)它到 settings.py:

AUTHENTICATION_BACKENDS = [
    'events.authentication'
]

这就是我登录用户的方式:

def login_view(request):
    if request.method == "POST":

        # Attempt to sign user in
        rollno = request.POST["rollno"]
        password = request.POST["password"]

        user = authenticate(request, username=rollno, password=password)

        # Check if authentication successful
        if user is not None:
            login(request, user)
            return HttpResponseRedirect(reverse("events:index"))
        else:
            return render(request, "events/login.html", {
                "message": "Invalid roll number and/or password."
            })
    else:
        return render(request, "events/login.html")

但我得到以下跟踪:

/login 模块“事件”处的 ImportError 未定义“身份验证”属性/类

我是一个菜鸟,我很确定我做错了什么,我只是不明白它是什么。

有人能告诉我怎么做吗?

【问题讨论】:

  • 应该是'events.authentication.authBackend'
  • @AbdulAzizBarkat 谢谢你的回复,是的,我意识到我需要导入类而不是文件,但是你能检查一下我的后端和我的 login_view 是否有问题?
  • @ApoorvaShridhar:最好从BaseBackend,甚至ModelBackend开始,因为后端也应该实现get_user_permissionsget_group_permissionsget_all_permissions和@987654330 @.
  • @AbdulAzizBarkat 实际上,我无法登录任何用户,它只是返回 None
  • @ApoorvaShridhar:您在参数名称中也打错了:它是password,而不是passwprd

标签: python django django-authentication django-users django-auth-models


【解决方案1】:

您还需要使用类名导入它,所以:

AUTHENTICATION_BACKENDS = [
    'events.authentication.authBackend'
]

在您的authBackend 中,您也犯了许多错误。首先认证后端needs to implement a number of functions [Django-doc]

用户模型及其管理器会将权限查找功能(get_user_permissions()get_group_permissions()get_all_permissions()has_perm()has_module_perms()with_perm())委托给任何实现这些功能的身份验证后端。

因此,您也需要实现此功能。因此,从BaseBackend [Django-doc] 继承可能会更好,或者从ModelBackend 继承可能更好,因为这已经实现了逻辑,因此您只需要覆盖某些函数即可使其与您的新模型一起使用。

您在参数名称中也打错了:它是password,而不是passwprd

from django.contrib.auth.backends import BaseBackend
from events.models import User

class authBackend(BaseBackend):
    def authenticate(self, request, username, password):
        try:
            user = User.objects.get(rollNo=username)
            success = user.check_password(password)
            if success:
                return user
        except User.DoesNotExist:
            pass
        return None

    def get_user(self, uid):
        try:
            return User.objects.get(pk=Uid)
        except:
            return None

注意:根据PEP-8 Style guide [pep-0008], 类名用 PerlCase 以大写开头,因此您可能需要考虑重命名 authBackend 转至AuthBackend

【讨论】:

  • 我仍然无法使用 login_view 登录用户,我认为这里有两个问题,一是我可能还需要在我的视图中导入身份验证功能,二是,我可能在实现后端时做错了(对不起,如果这看起来像一个愚蠢的问题,我是初学者)
  • @ApoorvaShridhar:您没有在视图中导入身份验证功能?
  • "from events.authentication import authBackend" and while using "user = authBackend.authenticate(request, username=rollno, password=password)" 这是正确的做法吗?
  • @ApoorvaShridhar from django.contrib.auth import authenticate
  • @WillemVanOnsem 我解决了这个问题。非常感谢,你帮了我很大的忙,谢谢
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2013-06-08
  • 2019-06-06
  • 2021-01-31
相关资源
最近更新 更多