Django自定义用户身份验证与电子邮件和IP地址

时间:2014-12-04 15:11:52

标签: django

我想将我们的一个应用程序(基于PHP)移动到Django。我无法解决如何遵循以下要求。

我不想使用用户名字段。我甚至不需要在数据库上使用这个字段,当然我需要在数据库上增加一些字段,例如" Job Title"我在登录过程中使用电子邮件字段作为唯一值。

此外,应用程序必须检查用户IP地址,每个用户可能有一个或多个IP地址。我曾经将用户IP地址存储在另一个名为user_ip的表中。但我不知道在身份验证过程中如何检查这一点。

任何想法和示例代码?

谢谢

2 个答案:

答案 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

如果我猜一下你的情况会是什么样子,那就是这样......

models.py

class IPAddress(models.Model):
    ip_address = models.GenericIPAddressField()

class CustomUser(models.Model):
    user = models.OneToOneField(User)
    ip_address = models.ManyToManyField(IPAddress)

authentication_backends.py

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