1

I have been trying to get my Django custom backend to work and it refuses to accept my credentials, which are correct in the database (I have verified this). It just keeps saying email and password are incorrect.

I am lost and don't know where to go from here with this. I really need help at this point.

VIEWS.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())

MODELS.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()

BACKENDS.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

SETTINGS.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',
]

0 Answers0