我想知道是否可以使用默认django.contrib.auth.models.User
来存储管理员用户,使用python manage.py createsuperuser
创建的用户,但是使用另一个表来存储由表单用户注册的用户,以及将注册的用户社交提供(python-social-auth
)。通过为用户使用另一个表,我将需要使用相同的密码哈希。
与auth_users
使用1对1的关系不是一种选择。
感谢。
答案 0 :(得分:1)
嗯,这就是我这样做的方式:
可以从python-social-auth
docs定义自定义模型:
SOCIAL_AUTH_USER_MODEL = 'foo.bar.User'
我尝试'myapp.models.MyUserModel'
时遇到错误,必须是:'myapp.MyUserModel'
。
这修复了python-social-auth
寄存器。
对于常见的表单注册表,我只是填写了一个表单,并在MyUserModel
中创建了一个用户:
class RegisterAction(FormView):
form_class = RegisterForm
def form_valid(self, form):
MyUserModel.objects.create(
first_name=form.data.get('f_name'),
password=form.data.get('pwd'),
email=form.data.get('email'),
newsletter=form.data.get('newsletter')
)
return super(RegisterAction, self).form_valid(form)
def get_success_url(self):
return reverse('home')
您可以找到FormView
here的文档。
要修复身份验证方法,我创建了一个自定义身份验证后端:
from django.contrib.auth.hashers import check_password
from myapp.models import MyUserModel
class MyAuthenticationBackend(object):
MODEL = MyUserModel
def authenticate(self, email, password):
"""
Returns a User (MODEL instance) if email and password match
"""
if email and password:
try:
user = self.MODEL.objects.get(email=email)
if check_password(password=password, encoded=user.password):
return user
return None
except self.MODEL.DoesNotExist:
return None
return None
def get_user(self, user_id):
"""
Returns a User based on user_id
"""
try:
user = self.MODEL.objects.get(pk=user_id)
return user
except self.MODEL.DoesNotExist:
return None
except self.MODEL.MultipleObjectsReturned:
return None
您可以找到身份验证后端文档here以及如何编写自己的后端here。
然后您需要注册新的后端:
# Authentication Backends
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'myapp.backends.MyAuthenticationBackend',
'social.backends.facebook.FacebookOAuth2',
'social.backends.twitter.TwitterOAuth',
]
您会找到AUTHENTICATION_BACKENDS
设置文档here
现在我可以去一个shell:
>>> from django.contrib.auth import authenticate
>>> authenticate(email='someuser@somemail.com', password='123')
<MyUserModel: MyUserModel object>
>>>
仍然可以使用python manage.py createsuperuser
创建用户,这些用户存储在默认的auth_user
表中。