身份验证后端(现有数据库表是身份验证源)

时间:2014-10-22 07:58:29

标签: django django-models django-authentication

我想创建一个身份验证后端,因为我的用户名和密码存储在现有的数据库表中。在此表中,除了用户名和密码之外,还有更多信息,这就是我创建扩展用户的原因。

class MyUser(AbstractUser):
    user = models.OneToOneField(User)
    user_id = models.IntegerField()
    code = models.BigIntegerField()
    telefon = models.CharField(50)
    remark = models.CharField(250)
    fio = models.CharField(50)

据我了解,我不必在此模型中加入usernamepassword,因为user = models.OneToOneField(User)已将其包括在内。 好的,然后我创建后端: 来自login.models导入MyUser

class AuthBackend:
    def authenticate(self, username=None, password=None):
        try:
            user = MyUser.user.objects.filter(username=username)
        except MyUser.DoesNotExist:
            return None

        if user.is_pass_valid(password):
            return user
        else:
            return None

    def get_user(self, user_id):
        try:
            user = MyUser.user.objects.get(id=user_id)
        except MyUser.DoesNotExist:
            return None

        return user

这一切都正确吗? 主要问题:我的后端如何从DB表(不是User表,而是现有表)返回auth_user对象。我必须在认证之前创建用户模型或者什么?或者,如果存在方法authenticate,我只想创建这样的用户?我应该在哪里调用get_user方法?

我的想法:

def authenticate(self, username=None, password=None):
        password = hashlib.md5(password).hexdigest()
        cursor = connection.cursor()
        cursor.execute("""
        SELECT * FROM zusers
        WHERE login = %s AND userpass = %s""", [username, password])
        row = cursor.fetchone()
        if row:
            user = MyUser(username = row[0], password = row[1], code = row[2], telefon = row[3], remark = row[4], fio = row[5])
            return user
        else:
            return None

1 个答案:

答案 0 :(得分:0)

我没有真正得到你正在尝试的东西......你正在使用md5而不是真正用于加密密码的东西...

如果您想扩展用户,那么从django 1.5开始就很简单:

class MyUser(AbstractUser):
    myCustomField = models.CharField()
    #You don't need ids, oneToOne or anything weird...just extra fields for your user

现在在settings.py或您设置的任何设置模块中:

AUTH_USER_MODEL = 'myapp.MyUser'

您可以在documentation

中找到相关信息

而且......就是这样,你不需要任何其他东西来使它发挥作用。请记住,当您打算在其他模型中使用您的用户时,您有两个选择:

from django.conf import settings
from django.db import models

class Article(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL)

或者:

from myapp.models import MyUser
from django.db import models

class Article(models.Model):
    author = models.ForeignKey(MyUser)

使用这种方法你不必担心其他任何事情,只要忘记默认...每次都使用MyUser。