Python 为Django中的每个用户设置IP白名单

Python 为Django中的每个用户设置IP白名单,python,django,django-models,django-rest-framework,django-authentication,Python,Django,Django Models,Django Rest Framework,Django Authentication,我希望当用户打算登录时,如果用户从一个新的IP地址登录,他们的登录就会失败 以及包含以下内容的电子邮件: 您从新的IP地址(109.169.65.137)登录,是否要添加 此IP为“允许的IP列表” 将被发送到他们的电子邮件 提示:如果用户允许的IP_列表为“无”,则用户可以从任何IP地址登录 有人可以指导我实现这个场景吗 我使用的是自定义用户模型 class CustomUserManager(BaseUserManager): use_in_migrations = True

我希望当用户打算登录时,如果用户从一个新的IP地址登录,他们的登录就会失败

以及包含以下内容的电子邮件:

您从新的IP地址(109.169.65.137)登录,是否要添加 此IP为“允许的IP列表”

将被发送到他们的电子邮件

提示:如果用户允许的IP_列表为“无”,则用户可以从任何IP地址登录

有人可以指导我实现这个场景吗

我使用的是自定义用户模型

class CustomUserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, mobile_number, password, **extra_fields):
        """
        Creates and saves a User with the given email and password.
        """
        if not email:
            raise ValueError('The given email must be set')
        email   = self.normalize_email(email)
        mobile_number   = mobile_number
        user    = self.model(email=email, mobile_number= mobile_number, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, mobile_number, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, mobile_number, password, **extra_fields)

    def create_superuser(self, email, mobile_number, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_active') is not True:
            raise ValueError('Superuser must have is_active=True.')
        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, mobile_number, password, **extra_fields)


class User(AbstractUser):
    username        = None
    email           = models.EmailField(_('email address'), unique=True, validators= [validate_email])
    mobile_number   = models.CharField(_("mobile number"), max_length=11, unique = True, validators= [validate_mobile_number])

    USERNAME_FIELD  = 'email'
    REQUIRED_FIELDS = ['mobile_number']

    objects = CustomUserManager()

    def __str__(self):
        return self.email

    def get_full_name(self):
        return "{} {}".format(self.first_name, self.last_name)

首先,您需要一个字段来存储用户允许的IP

from django.contrib.postgres.fields import ArrayField

class User(AbstractUser):
    allowed_ips = ArrayField(models.CharField(max_length=20), default=list)
然后,您需要一个自定义的身份验证后端来处理拒绝或允许用户基于其IP进行身份验证的问题

然后您需要更改
身份验证\u后端
设置

AUTHENTICATION_BACKENDS = ['app.backends.IPBasedModelBackend']
电子邮件需要提供一个链接,指向应用程序中的视图,该视图将IP附加到
用户。允许的\u ips

def add_allowed_ip(request):
    ip = request.GET.get('ip')  # Not sure this would be the most secure place to put it...
    user_id = request.GET.get('user_id')  # Same here...
    user = User.objects.get(id=user_id)
    user.allowed_ips.append(ip)
    user.save()
    return redirect('login')

首先,您需要一个字段来存储用户允许的IP

from django.contrib.postgres.fields import ArrayField

class User(AbstractUser):
    allowed_ips = ArrayField(models.CharField(max_length=20), default=list)
然后,您需要一个自定义的身份验证后端来处理拒绝或允许用户基于其IP进行身份验证的问题

然后您需要更改
身份验证\u后端
设置

AUTHENTICATION_BACKENDS = ['app.backends.IPBasedModelBackend']
电子邮件需要提供一个链接,指向应用程序中的视图,该视图将IP附加到
用户。允许的\u ips

def add_allowed_ip(request):
    ip = request.GET.get('ip')  # Not sure this would be the most secure place to put it...
    user_id = request.GET.get('user_id')  # Same here...
    user = User.objects.get(id=user_id)
    user.allowed_ips.append(ip)
    user.save()
    return redirect('login')

首先,您需要为每个用户存储这个IP白名单,如果您使用的是postgres,那么您可以使用一个数组field@iain-shelvington然后呢?首先你需要为每个用户存储这个IP白名单,如果你使用的是postgres,你可以使用一个数组field@iain-shelvington然后呢?当用户使用新的ip地址时,用户不能在该用户cli之后登录勾选我们的链接并发送到我的视图并添加\u允许的\u ip函数调用用户未进行身份验证,然后如何获取用户\u id?用户\u id=request.get.get('user\u id'))如果您要使用上面给出的视图,您将向模板中发送的URL的查询字符串添加
user\u id
。当用户使用新的ip地址时,用户无法登录,因此在该用户单击我们的链接并发送到我的视图并添加\u allowed\u ip函数调用user dosen not authenticate之后,我们如何获取用户\u id?user\u id=request.get.get('user_id')如果要使用上面给出的视图,则需要将
user_id
添加到模板中发送的URL的查询字符串中