Как сделать пользовательский бэкэнд аутентификации? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть веб-система, в которой есть 2 входа, один из которых является нормальным с именем пользователя и паролем, другой вход будет только с полем с именем rfid, в данный момент я тестирую с полем имени пользователя, затем я изменю это для поля RFID. Если то, что я пытаюсь сделать, это войти в систему без пароля, для этого я реализовал бэкэнд, чтобы иметь возможность войти в систему пользователя без пароля, просто он еще не разрешил мне войти и продолжает спрашивать меня о пароль. Как я могу это сделать?

Backend

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

class PasswordlessAuthBackend(ModelBackend):
    def authenticate(self, username=None):
        try:
            return User.objects.get(username=username)
        except User.DoesNotExist:
            return None

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

settings.py

AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend',
                       'myproject.auth_backend.PasswordlessAuthBackend']

посмотреть .py

def login_rfid(request, username=None):
if request.method == 'POST':
    form = AuthenticationForm(data=request.POST or request.GET or None)
    if form.is_valid():
        form.save()
        username = form.cleaned_data.get('username')
        user = authenticate(username=username)

        if user is not None:
            ogin(request, user)
            return redirect('home')
else:
    form = AuthenticationForm()

return render(request, "registration/login_rfid.html", {'form': form})

html

<form method="post" action="{% url 'login_rfid' %}">
    {% csrf_token %}

    <div>
        <td>{{ form.username.label_tag }}</td>
        <td>{{ form.username }}</td>
    </div>

    <div>
        <input type="submit" value="login"/>
        {#  <input type="hidden" name="next" value="{{ next }}" />#}
        <input type="hidden" name="next" value="/"/>
    </div>
</form>
...