我想知道最好的方法是使用内置身份验证系统将用户身份验证数据存储在带有django的neo4j数据库中。
有人有这样做的经验吗?
我想这与将AbstractBaseUser和BaseUserManager子类化有关,但是对于我来说,我无法弄清楚。
如果有人以前实现过此代码段,将非常感谢。
非常感谢
答案 0 :(得分:0)
如果要扩展Django用户模型,请首先检查此article。它显示了扩展用户模型的不同方法。在上一个解决方法中,我需要Neo4j中的所有信息,因此我将模型修改为在模型中包含用户字段(这是Student模型)。每当有新学生注册到该应用程序时,保存后(post_save),我都会发出信号做出反应,并存储密码和用户名。您可以探索Django信号here
对于该模型,我有:
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)