1

我一直在尝试让我的 Django 自定义后端工作,但它拒绝接受我的凭据,这些凭据在数据库中是正确的(我已经验证了这一点)。它只是一直说电子邮件和密码不正确。

我迷路了,不知道从这里到哪里去。在这一点上我真的需要帮助。

意见.PY


    class MyLogin(LoginView):
        template_name = 'employees/login.html'
        success_url = 'employees:emp-home'
        authentication_form = LoginForm

        def get_success_url(self):
            return super().get_success_url()

        def form_valid(self, form):
            user = self.request.POST['username']
            password = self.request.POST['password']
            authenticate(EmpBackend, self.request, user, password)

            return HttpResponseRedirect(self.get_success_url())

模型.PY


    class EmpUserManager(BaseUserManager):
        def create_user(self, email, password=None):
            if not email:
                raise ValueError("Users must have an email address")

            user = self.model(email=self.normalize_email(email))
            user.set_password(password)
            user.save()
            return user

        def create_staffuser(self, email, password):
            """
            Creates and saves a staff user with the given email and password.
            """
            user = self.create_user(
                email,
                password=password,
            )
            user.staff = True
            user.save(using=self._db)
            return user

        def create_superuser(self, email, password):
            user = self.create_user(email, password=password)
            user.staff = True
            user.save()
            return user


    class Emp(AbstractBaseUser):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        email = models.CharField(max_length=100, default=None, unique=True)
        first_name = models.CharField(max_length=100, default=None, null=True)
        last_name = models.CharField(max_length=100, default=None, null=True)
        username = models.CharField(max_length=100, default=None, null=True)
        password = models.CharField(max_length=100, default=None)
        phone = models.CharField(max_length=20, default=None, null=True, blank=True)
        address1 = models.CharField(max_length=100, default=None, null=True, blank=True)
        address2 = models.CharField(max_length=100, default=None, null=True, blank=True)
        city = models.CharField(max_length=100, default=None, null=True, blank=True)
        state = models.CharField(max_length=100, default=None, null=True, blank=True)
        zip = models.CharField(max_length=10, default=None, null=True, blank=True)
        position = models.CharField(max_length=50, default=None)
        date_hired = models.DateTimeField(auto_now_add=True)
        date_updated = models.DateTimeField(auto_now_add=True)
        date_terminated = models.DateTimeField(default=None, null=True, blank=True)
        status = models.SmallIntegerField(default=0)
        emp_is_salary = models.BooleanField(default=False)
        emp_pto_rate = models.DecimalField(max_digits=8, decimal_places=4, default=0.0)
        emp_user_level = models.SmallIntegerField(default=1)
        emerg_contact1 = models.CharField(max_length=100, default=None, null=True, blank=True)
        emerg_contact1_phone = models.CharField(max_length=20, default=None, null=True, blank=True)
        emerg_contact1_address = models.CharField(max_length=200, default=None, null=True, blank=True)
        emerg_contact1_city_st = models.CharField(max_length=200, default=None, null=True, blank=True)
        emerg_contact2 = models.CharField(max_length=100, default=None, null=True, blank=True)
        emerg_contact2_phone = models.CharField(max_length=20, default=None, null=True, blank=True)
        emerg_contact2_address = models.CharField(max_length=200, default=None, null=True, blank=True)
        emerg_contact2_city_st = models.CharField(max_length=200, default=None, null=True, blank=True)
        emp_note = models.TextField(default=None, null=True, blank=True)
        emp_hourly_rate = models.DecimalField(max_digits=8, decimal_places=4, default=0.0)
        emp_net_pto = models.DecimalField(max_digits=8, decimal_places=4, default=0.0)
        emp_pto_prev = models.DecimalField(max_digits=8, decimal_places=4, default=0.0)
        emp_image = models.ImageField(upload_to='media/employees/profile-pics/',
                                      default='media/employees/profile-pics/default.png', null=True, blank=True)

        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = []

        def get_full_name(self):
            return f'{self.first_name} {self.last_name}'

        def get_email(self):
            return self.email

        def __str__(self):
            return self.email

        def save(self, *args, **kwargs):
            super(Emp, self).save(*args, **kwargs)
            self.username = self.email
            img = Image.open(self.emp_image.path)

            if img.height > 300 or img.width > 300:
                output_size = (300, 300)
                img.thumbnail(output_size)
                img.save(self.emp_image.path)

        def get_user_permissions(self, obj=None):
            return True

        def get_absolute_url(self):
            return reverse('employees:emp-detail', args=[self.id])

        objects = UserManager()

后端.PY

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from .models import Emp
from .views import *

User = get_user_model()


class EmpBackend(ModelBackend):

    supports_object_permissions = True
    supports_anonymous_user = False
    supports_inactive_user = False

    def authenticate(self, email=None, password=None, **kwargs):
        username = kwargs.get('username')
        password = kwargs.get('password')

        if username is None or password is None:
            return
        try:
            user = User.objects.get(email=username)
            if user.check_password(password) and self.user_can_authenticate(user):
                return user
        except User.DoesNotExist:
            return None
        return None

    def user_can_authenticate(self, user):
        is_active = getattr(user, 'is_active', None)
        return is_active or is_active is None

    def get_user(self, user_id):
        try:
            return Emp.objects.get(pk=user_id)
        except Emp.DoesNotExist:
            return None

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

设置.py

# Login model override
AUTH_USER_MODEL = 'auth.User'
# AUTH_PROFILE_MODEL = 'employess.Emp'
LOGIN_URL = 'employees:login'
LOGIN_REDIRECT_URL = 'employees:emp-home'
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'employees.backends.EmpBackend',
]

4

0 回答 0