Python 为Django中的每个用户设置IP白名单
我希望当用户打算登录时,如果用户从一个新的IP地址登录,他们的登录就会失败 以及包含以下内容的电子邮件: 您从新的IP地址(109.169.65.137)登录,是否要添加 此IP为“允许的IP列表” 将被发送到他们的电子邮件 提示:如果用户允许的IP_列表为“无”,则用户可以从任何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
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的查询字符串中