我想创建一个身份验证后端,因为我的用户名和密码存储在现有的数据库表中。在此表中,除了用户名和密码之外,还有更多信息,这就是我创建扩展用户的原因。
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)
据我了解,我不必在此模型中加入username
和password
,因为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
答案 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。