[1.11] custom backend not working

15 views
Skip to first unread message

Henrik Baran

unread,
Nov 25, 2017, 3:35:30 PM11/25/17
to django...@googlegroups.com
Hi,

for certain reasons I need to define custom user model and backend. First I only created a custom backend and kept with the standard user table Django provides.
Authentication seems to work fine but the login is broken. By my view you can see that in case the user .is_authenticated a redirect happens. When I print the request.user I always end up with "AnonymousUser" even after successful authentication. So I assume the login is stuck. But what did I do wrong? I can't see a difference to what is guided in the documentation.
# django imports
from django.contrib.auth import get_user_model


UserModel = get_user_model()


class MyBackend(object):
    def authenticate(self, request, username, password):
        try:
            user = UserModel.objects.get_by_natural_key(username)
        except UserModel.DoesNotExist:
            return None
        else:
            if argon2.verify(password, user.password) and self.user_can_authenticate(user):
                return user

    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, username):
        try:
            user = UserModel.objects.get(username=username)
        except UserModel.DoesNotExist:
            return None
        else:
            return user if self.user_can_authenticate(user) else None

This is my view:


from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User


@require_http_methods(["GET", "POST"])
def index(request):
    context = {'tables': None,
               'content': 'login',
               'session': None,
               'user': None}

    if request.user.is_authenticated:
        return HttpResponseRedirect('/rtd')

    form = forms.LoginForm(request.POST)

    # POST
    if request.method == 'POST':
        if form.is_valid():
            username = form.cleaned_data['user']
            password = form.cleaned_data['password']
            # authenticate user
            user = authenticate(request=request, username=username, password=password)
            if user is not None:
                # login user
                login(request, user)
                # message + log entry
                message = 'Authentication successful! User "{}" logged in.'.format(user)
                log.info(message)
                data = {'response': True,
                        'message': message}
                return JsonResponse(data)
            else:
                # check if username exist to track failed login attempts
                if models.Users.objects.filter(username=username).exists():
                if User.objects.filter(username=username).exists():
                    message = 'User "{}" tried to log in.'.format(username)
                    log.warning(message)
                # message + log entry
                message = 'Authentication failed! Please provide valid username and password.'
                # log.warning(message)
                data = {'response': False,
                        'message': message}
                return JsonResponse(data)
        else:
            # message + log entry
            message = 'Authentication failed! Please provide valid username and password.'
            # log.warning(message)
            data = {'response': False,
                    'message': message}
            return JsonResponse(data)

    # GET
    else:
        context['login'] = [forms.LoginForm().as_p()]
        return render(request, 'lab/index.html', context)

settings:

AUTHENTICATION_BACKENDS = [
    'lab.backend.MyBackend',
    # 'django.contrib.auth.backends.ModelBackend'
]

# AUTH_USER_MODEL = 'lab.Users'




Thanks for any help !!!


signature.asc
Reply all
Reply to author
Forward
0 new messages