使用两个Users表

时间:2016-03-03 14:49:55

标签: django django-models django-users

我想知道是否可以使用默认django.contrib.auth.models.User来存储管理员用户,使用python manage.py createsuperuser创建的用户,但是使用另一个表来存储由表单用户注册的用户,以及将注册的用户社交提供(python-social-auth)。通过为用户使用另一个表,我将需要使用相同的密码哈希。

auth_users使用1对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表中。