python redis 实现IP校验 黑名单

该博客介绍了如何使用Python进行IP校验,当某个IP在10秒内访问次数超过200次,系统会将该IP加入到Redis黑名单中。项目中采用了MongoDB作为数据库,并提供了相关的测试代码确保功能正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python实现IP 检验,并且将10s内访问超过200次的ip加入黑名单列表。

本项目使用的是mongodb数据库 

from datetime import datetime
import logging

# from redis import Redis
import redis
from mongoengine.context_managers import switch_collection

from ego_model.py_auth_models import BlackNameList

pool = redis.ConnectionPool(host='ip', port=6379, password="88141")
R = redis.Redis(connection_pool=pool)


class IPViewSet(object):
    @classmethod
    def check_save_ip(cls, ip, sn, logger_group):
        # 主方法, 检查ip是否在黑名单,如果不在,将ip的计数加1,并且设置超时时间10s,判断ip的次数是否超过200,如果超过,将该ip保存至黑名单
        logger = logging.getLogger(logger_group)
        if cls.check_black_ip(ip):
            ip_key = cls.get_redis_string_key(ip)
            current_count = R.incr(ip_key, 1)
            if current_count == 1:
                R.expire(ip_key, 10)

            if current_count > 200:
                # 10s超过200次,将ip加入黑名单
                cls.add_black_namelist(ip)
                logg
### JWT 黑名单撤销机制的实现方式 JWT(JSON Web Token)是一种广泛使用的身份验证方法,但由于其无状态特性,在某些场景下可能需要引入黑名单机制来支持令牌的撤销操作。以下是关于如何在 JWT 中实现或撤销黑名单功能的具体说明: #### 1. 使用 Redis 存储黑名单 为了实现 JWT 的撤销功能,可以借助外部存储工具如 Redis 来维护一个黑名单表。当某个 token 被标记为无效,将其加入到 Redis黑名单集合中。 - **添加到黑名单** 当服务器接收到用户的注销请求或其他需要撤销当前 token 的情况,将该 token 或其 `jti` 声明(唯一标识符)存入 Redis 数据库[^1]。 - **校验逻辑更新** 在每次验证 token 是否有效之前,先查询 Redis 中是否存在对应的 token 或 `jti`。如果存在,则认为该 token 已被撤销并拒绝访问[^2]。 ```python import redis from jwt import decode, InvalidTokenError redis_client = redis.StrictRedis(host='localhost', port=6379, db=0) def is_token_blacklisted(token): try: decoded_payload = decode(token, options={"verify_signature": False}) jti = decoded_payload.get('jti') if redis_client.exists(jti): # 如果存在于 Redis 则表示已被撤销 return True return False except (InvalidTokenError, AttributeError): return True # 非法 token 默认视为已撤销 ``` --- #### 2. 设置过期间以优化性能 为了避免 Redis 中的数据无限增长,可以在向 Redis 添加记录的同设置合理的 TTL(Time To Live)。这样即使未主动删除数据,也会自动清理掉已经失效的条目。 ```python TTL_IN_SECONDS = 86400 # 一天的间长度 def add_to_blacklist(token): try: decoded_payload = decode(token, options={"verify_signature": False}) jti = decoded_payload.get('jti') if jti: redis_client.setex(name=jti, value="blacklisted", time=TTL_IN_SECONDS) except Exception as e: pass # 处理异常但不影响主要流程 ``` --- #### 3. 取消黑名单中的项 如果有需求重新激活某特定 token,则可以从 Redis 删除对应键值即可完成取消操作。 ```python def remove_from_blacklist(token): try: decoded_payload = decode(token, options={"verify_signature": False}) jti = decoded_payload.get('jti') if jti and redis_client.exists(jti): redis_client.delete(jti) except Exception as e: pass # 安全处理错误状况 ``` 通过以上步骤能够有效地管理和控制基于 JWT 认证系统的用户会话生命周期,并提供更加灵活的安全策略选项[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值