Credentials fail from custom Auth backend

36 views
Skip to first unread message

David Crandell

unread,
Jul 4, 2021, 1:48:58 AM7/4/21
to Django users
Hello, I am using a custom auth backend and everything displays properly, except I cannot login with the credentials in my model. I have spent 5 hours on this and cannot figure it out. Please help.

views.py

class MyLogin(LoginView):
template_name = 'employees/login.html'
form_class = LoginForm


def form_valid(self, form):
user = form.get_user()
employee = Emp.objects.get(email=user)
if employee.is_active:
EmpBackend.authenticate(self.request, username=user, password=form.password)

return HttpResponseRedirect(self.get_success_url())

backends.py

from django.contrib.auth.backends import ModelBackend
from .models import Emp


class EmpBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = Emp.objects.get(email=username)
if user.check_password(password):
return user
except Emp.DoesNotExist:
return None

return None

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

models.py

class Emp(AbstractBaseUser):
first_name = models.CharField(max_length=100, default=None)
last_name = models.CharField(max_length=100, default=None)
email = models.EmailField(max_length=255, default=None, unique=True)
username = models.CharField(max_length=100, default=None, null=True)
phone = models.CharField(max_length=20, default=None, null=True, blank=True)
password = models.CharField(max_length=100)
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)
is_active = models.BooleanField(default=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='profile-pics/', default='profile-pics/default.png', null=True, blank=True)
last_login = models.DateTimeField(default=None, null=True)
is_staff = models.BooleanField(default=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True, blank=True)
is_superuser = models.BooleanField(default=False, 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 has_perm(self, perm, obj=None):
return True

def has_module_perms(self, app_label):
return True

@property
def is_staff(self):
return self.staff

@property
def is_admin(self):
return self.admin

def save(self, *args, **kwargs):
super(Emp, self).save(*args, **kwargs)

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.image)

self.last_login = timezone.utc

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

objects = UserManager()

ANi

unread,
Jul 4, 2021, 10:14:21 PM7/4/21
to Django users
What does the error message say? 
guitard...@gmail.com 在 2021年7月4日 星期日下午1:48:58 [UTC+8] 的信中寫道:

David Crandell

unread,
Jul 4, 2021, 11:26:43 PM7/4/21
to django...@googlegroups.com
There is no error. It just says invalid login. I get the login template and it rejects my credentials.

--
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/django-users/tTm1GGoffj8/unsubscribe.
To unsubscribe from this group and all its topics, send an email to django-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/8a2eb554-1dde-45d5-8a67-24dec60b909bn%40googlegroups.com.

David Crandell

unread,
Jul 5, 2021, 1:09:17 PM7/5/21
to Django users
This is the message I get when I try to login "Please enter a correct email and password. Note that both fields may be case-sensitive."

I've changed my code a little in an effort to try to remedy my situation.

I'm really stuck on this. From what I can tell, it's passing the values to the authenticate() method in my EmpBackend but it keeps saying password is not valid. How do I pass the correct password value? Am I overlooking something?

SETTINGS.PY

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

FORMS.PY

class LoginForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
super(LoginForm, self).__init__(*args, **kwargs)

username = forms.EmailField(widget=forms.TextInput(
attrs={
'class': 'form-control',
'placeholder': '',
'id': 'username',
}
))
password = forms.CharField(widget=forms.PasswordInput(
attrs={
'class': 'form-control',
'placeholder': '',
'id': 'password',
}
))

template_name = 'employees/login.html'

VIEWS.PY

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

def get_success_url(self):

return super(MyLogin, self).get_success_url()

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

return HttpResponseRedirect(self.get_success_url())

MODELS.PY

@property
def is_staff(self):
return self.staff

@property
def is_admin(self):
return self.admin

def save(self, *args, **kwargs):
super(Emp, self).save(*args, **kwargs)

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.image)

self.last_login = timezone.utc

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

objects = UserManager()

David Crandell

unread,
Jul 5, 2021, 1:10:05 PM7/5/21
to Django users
BACKENDS.PY

class EmpBackend(ModelBackend):
Emp = get_user_model()

supports_object_permissions = True
supports_anonymous_user = False
supports_inactive_user = False

def authenticate(self, request, email=None, password=None, **kwargs):
if email is None or password is None:
return
try:
username = kwargs.get('Emp.USERNAME_FIELD')
user = Emp.objects.get(email=username)
if user.check_password(password) and self.user_can_authenticate(user):

return user
except Emp.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

Reply all
Reply to author
Forward
0 new messages