我想将我们的一个应用程序(基于PHP)移动到Django。我无法解决如何遵循以下要求。
我不想使用用户名字段。我甚至不需要在数据库上使用这个字段,当然我需要在数据库上增加一些字段,例如" Job Title"我在登录过程中使用电子邮件字段作为唯一值。
此外,应用程序必须检查用户IP地址,每个用户可能有一个或多个IP地址。我曾经将用户IP地址存储在另一个名为user_ip的表中。但我不知道在身份验证过程中如何检查这一点。
任何想法和示例代码?
谢谢
答案 0 :(得分:0)
你可以继承django令人敬畏的auth系统模型。例如用户模型
from django.contrib.auth.models import User
class CustomUser(models.Model):
user = models.OneToOneField(User) #<-- Django's User
# other extra fields you want
class User_IP(models.Model):
user = models.ForeignKey(CustomUser)
u_ip = models.CharField(max_length=20)
登录cicle:
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
customuser = user.get_profile()
# check for IP etc.. then:
login(request, user)
# Redirect to a success page.
else:
# Return a 'disabled account' error message
else:
# Return an 'invalid login' error message.
docs:https://docs.djangoproject.com/en/1.6/topics/auth/customizing/
答案 1 :(得分:0)
我建议您查看用于创建自定义身份验证后端的文档。 https://docs.djangoproject.com/en/dev/topics/auth/customizing/#writing-an-authentication-backend
如果我猜一下你的情况会是什么样子,那就是这样......
class IPAddress(models.Model):
ip_address = models.GenericIPAddressField()
class CustomUser(models.Model):
user = models.OneToOneField(User)
ip_address = models.ManyToManyField(IPAddress)
class EmailIPAuthBackend(object):
def authenticate(self, email=None, ip_address=None):
try:
return CustomUser.objects.get(user__email=email, ip_address=ip_address).user
except CustomUser.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
然后您可以将此身份验证后端插入settings.py ...
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'path.to.your.custom.authetication_backends.EmailIPAuthBackend')
当现在登录用户时,Django将首先尝试它的默认身份验证功能,当失败时,它将尝试您的自定义身份验证功能。
如果您确实需要从基本用户中删除用户名,那么您需要查看此处https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model