1

我正在 Django 中创建一个项目,并且我有一个HelpDesk我想在项目中使用的数据库。在数据库中,我有log_user存储登录信息的表,但除了 Django 默认表之外,我找不到其他方法来进行身份验证。

视图.py

from django.shortcuts import render
from django.http import HttpResponse
from .forms import Person
from django.contrib.auth import authenticate, login

def user_login(request):
    if request.method == 'POST':
        form = Person(request.POST)
        if form.is_valid():
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(request, username=username, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return HttpResponse('Authenticated sucessfully')
                else:
                    return HttpResponse('Disable account')
            else:
                return HttpResponse('Invalid Login')
    else:
        form = Person()
        return render(request, 'login2.html', {'form': form})

表格.py

from django import forms
from .models import Loginteste

class Person(forms.ModelForm):
    class Meta:
        model = Loginteste
        fields = ['username', 'password']

模型.py

from django.db import models

class Loginteste(models.Model):
    username = models.CharField(max_length=50, blank=True, null=True)
    password = models.CharField(max_length=50, blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'loginteste'

auth_backend.py

from .models import Loginteste

class MyBackend:
    def authenticate(self, request, username=None, password=None):
        user = Loginteste.object.get(username=username)
        if user.check_password(password):
            return (request, user)

我尝试使用默认表“用户”并且登录功能有效,但我无法使用已经存在的表(log_user在数据库中HelpDesk)。

4

1 回答 1

2

我想我现在明白你的问题了。

据我所知,Django 确实依赖于User模型;它可以是自定义用户模型,但必须有某种User模型。

当您构建自己的身份验证后端时,它仍然必须返回User实例(或您的自定义User模型实例)。

例如:

文件auth_backends.py

from django.contrib.auth.models import User
from .models import Loginteste

class MyAuthBackend:
    def authenticate(self, request, username=None, password=None):
        if username is None or password is None:
            # nothing to do
            return None

        # get 'User' object
        try:
            usr = User.objects.get(username=username)
        except User.DoesNotExist:
            return None

        # get 'Loginteste' object
        try:
            loginteste = Loginteste.objects.get(username=username)
        except Loginteste.DoesNotExist:
            return None

        # authenticate user
        if not loginteste.check_password(password):
            # incorrect password
            return None

        return usr

    def get_user(self, pk):
        try:
            return User.objects.get(pk=pk)
        except User.DoesNotExist:
            pass

        return None

文件设置.py

AUTHENTICATION_BACKENDS = [
    'project_config.auth_backends.MyAuthBackend',
    # 'django.contrib.auth.backends.ModelBackend',
]

您可能拥有的唯一相对简单的选择是将模型Loginteste用作您的自定义用户模型。其他一切都涉及覆盖大量 Django 代码以使其工作。

于 2018-06-20T11:11:55.620 回答