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