Можно ли использовать django_neomodel со встроенной системой аутентификации Django? - PullRequest
0 голосов
/ 06 ноября 2018

Мне интересно, как лучше всего хранить данные аутентификации пользователей в базе данных neo4j с помощью django, используя встроенную систему аутентификации.

У кого-нибудь есть такой опыт?

Я представляю, что это как-то связано с подклассами AbstractBaseUser и BaseUserManager, но, судя по всему, я не могу этого понять.

Буду очень признателен за фрагмент кода, если кто-то достиг этого раньше.

Большое спасибо

1 Ответ

0 голосов
/ 10 июля 2019

Если вы хотите расширить модель Django User, сначала проверьте эту статью . Здесь показаны разные способы расширения модели User. В моем последнем обходном пути мне потребовалась вся информация в Neo4j, поэтому я адаптировал свою модель, чтобы в нее входили поля пользователя (это была модель Стьюдента). Всякий раз, когда новый ученик регистрируется в приложении, у меня появляется сигнал на реагирование после сохранения (post_save), и он сохраняет пароль и имя пользователя. Вы можете исследовать сигналы Джанго здесь

Для модели у меня есть:

class StudentProfile(DjangoNode):
    first_name = StringProperty(max_length=30)
    last_name = StringProperty(max_length=150)
    email = EmailProperty()
    birth = DateProperty()
    username = StringProperty(max_length=150, unique=True)
    password = ''

Для сигнала:

@receiver(post_save, sender=StudentProfile, dispatch_uid='create_user_student')
def create_user_student(sender, instance, created, **kwargs):
    if created:
        user = User.objects.create_user(instance.username)
        user.set_password(instance.password)
        user.save()


@receiver(post_delete, sender=StudentProfile, dispatch_uid='delete_user_student')
def delete_user_student(sender, instance, **kwargs):
    User.objects.filter(username=instance.username).delete()

Помимо основного представления StudentProfile, у меня есть представление, использующее встроенную систему аутентификации Django:

from django.contrib.auth import authenticate, login as do_login, logout as do_logout

...

@api_view(["POST"])
def login(request):
    username = request.data.get('username')
    password = request.data.get('password')

    user = authenticate(username=username, password=password)

    if user is not None:
        do_login(request, user)
        return Response({'login': 'ok'}, status=status.HTTP_200_OK)
    return Response({'login': 'Error on credentials'}, status=status.HTTP_403_FORBIDDEN)
...