аутентификация Django без пароля - PullRequest
18 голосов
/ 03 июля 2011

Я использую систему аутентификации по умолчанию с django, но я добавил в библиотеку OpenID, где я могу аутентифицировать пользователей через OpenID.То, что я хотел бы сделать, это войти в систему, но, похоже, с использованием системы аутентификации django по умолчанию, мне нужен их пароль для аутентификации пользователя.Есть ли способ обойти это без фактического использования их пароля?

Я хотел бы сделать что-то вроде этого ...

user = ... # queried the user based on the OpenID response
user = authenticate(user) # function actually requires a username and password
login(user)

Я скорее просто отключаю функцию authenticate, но она присоединяет поле backend, которое требуетсяпо логину.

Ответы [ 4 ]

22 голосов
/ 21 января 2014

Для этого просто написать собственный бэкэнд аутентификации.Если вы создадите yourapp / auth_backend.py со следующим содержимым:

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


class PasswordlessAuthBackend(ModelBackend):
    """Log in to Django without providing a password.

    """
    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

Затем добавьте в свои настройки.пароль:

user = authenticate(username=user.username)
login(request, user)
8 голосов
/ 05 июля 2011

Это что-то вроде хака, но если вы не хотите переписывать кучу вещей, удалите аутентифицируемый

user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, user)

, пользователь будет вашим пользовательским объектом

2 голосов
/ 03 июля 2011

Вы можете легко исправить это, создав собственный аутентификационный бэкэнд аутентификации и добавив его в настройку AUTHENTICATION_BACKENDS.

Уже есть несколько бэкэндов OpenID, так что, немного поискав, вы избавите себя от необходимости писать один.

0 голосов
/ 18 марта 2019

Для того, чтобы сделать аутентификацию без пароля:

В ваших настройках.py:

AUTHENTICATION_BACKENDS = [
# auth_backend.py implementing Class YourAuth inside yourapp folder
    'yourapp.auth_backend.YourAuth', 
# Default authentication of Django
    'django.contrib.auth.backends.ModelBackend',
]

В вашем auth_backend.py:

# Если у вас есть пользовательская модель для вашего приложения, импортируйте ее из .models CustomUser

from .models import User 
from django.conf import settings




# requires to define two functions authenticate and get_user

class YourAuth:  

    def authenticate(self, request, username=None):
        try:
            user = User.objects.get(username=username)
            return user
        except User.DoesNotExist:
            return None

        return None

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

В ваших представлениях для пользовательского запроса входа в систему:

# Your Logic to login user
userName = authenticate(request, username=uid)
login(request, userName)

Для справки см. https://docs.djangoproject.com/en/2.1/topics/auth/customizing/

...