黑白名单方案

通用黑白名单方案

背景

设计一套灵活的黑白名单机制,要求无需修改代码即可修改黑白名单逻辑的切换。使用场景如下,比如原先一个新功能上线,我们期望给部分企业使用;等功能成熟后,我们一般会开放给所有的企业一起使用,但是好巧不巧,一家企业不愿意使用这个功能。我们不可能给每一个企业配置白名单。这样,我们就需要一个黑名单功能,即实现单独给不愿意使用新功能的企业单独配置一个名单。
为了不修改代码,我们只需要修改名单类型,配置相关名单的企业就好了。

方案设计

+----------------+        +-----------------+
|  Feature Flag  |        |  Configuration  |
|   Management   |        |     Storage     |
|     System     |        | (e.g., JSON,    |
+-------+--------+        |  Database, etc.) ||                 +--------+---------+|                          ||                          ||      +------------+      |+----->+  Blacklist +<-----++------------+^|v+------------+|  Whitelist  |+------------+^|v+------------+| Enterprise ||  Service   |

需要新建两张表:

  • 开关表设计:表明自己是白名单、还是黑名单,以及对应的开关状态。
  • 控制关联表则记录关联的企业ID。

方案可行性评估:

提出的黑白名单机制在设计上是可行的,可以通过数据库表来控制名单的逻辑和状态。通过这种设计,可以在不修改代码的情况下,通过更新数据库表来切换黑白名单的逻辑和修改名单内容。这种方法可以提供灵活的配置管理,并且可以即时生效,符合要求。

数据库表设计:

我们需要两张表,一张是名单模式开关表(list_switch),另一张是名单关联表(list_association)。

  1. 名单模式开关表(list_switch):用来记录当前名单模式是黑名单还是白名单,以及开关状态。
CREATE TABLE `list_switch` (`id` INT AUTO_INCREMENT PRIMARY KEY,`list_type` ENUM('BLACKLIST', 'WHITELIST') NOT NULL,`is_active` BOOLEAN NOT NULL DEFAULT TRUE,`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
  1. 名单关联表(list_association):记录关联的企业ID,与名单模式开关表关联。
CREATE TABLE `list_association` (`id` INT AUTO_INCREMENT PRIMARY KEY,`enterprise_id` INT NOT NULL,`list_switch_id` INT NOT NULL,FOREIGN KEY (`list_switch_id`) REFERENCES `list_switch`(`id`)
);

示例代码:
以下是一个简单的 Spring Boot 服务层示例,演示了如何根据数据库表中的配置来决定是否允许某个企业ID执行操作。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.jdbc.core.JdbcTemplate;@Service
public class ListService {@Autowiredprivate JdbcTemplate jdbcTemplate;public boolean isAllowed(int enterpriseId) {// 查询当前名单模式和状态String listSwitchSql = "SELECT list_type, is_active FROM list_switch WHERE is_active = TRUE LIMIT 1";Map<String, Object> listSwitch = jdbcTemplate.queryForMap(listSwitchSql);String listType = (String) listSwitch.get("list_type");boolean isActive = (Boolean) listSwitch.get("is_active");if (!isActive) {// 如果名单模式未激活,允许所有操作return true;}// 查询企业ID是否在名单关联表中String listAssociationSql = "SELECT COUNT(1) FROM list_association WHERE enterprise_id = ?";int count = jdbcTemplate.queryForObject(listAssociationSql, new Object[]{enterpriseId}, Integer.class);if ("WHITELIST".equals(listType)) {// 如果是白名单模式,只有在名单中的企业ID才允许操作return count > 0;} else if ("BLACKLIST".equals(listType)) {// 如果是黑名单模式,名单中的企业ID不允许操作return count == 0;}// 默认允许操作return true;}
}

在这个示例中,isAllowed 方法首先检查名单模式是否激活,并获取当前的名单类型。然后,它查询关联表以确定企业ID是否在名单中。根据名单类型(黑名单或白名单),方法返回是否允许企业ID执行操作。

这个示例提供了一个基础的实现,但在实际应用中,你可能需要添加更多的逻辑来处理并发更新、缓存名单状态以提高性能、提供管理接口来更新名单等。此外,为了保证数据的一致性和可靠性,你可能还需要在数据库操作中使用事务管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】6-10 输出最大值 分数 10

6-10 输出最大值 分数 10 全屏浏览 切换布局 作者 范鹏程 单位 内蒙古师范大学 根据给定的程序&#xff0c;写成相关的成员函数&#xff0c;完成指定功能。 函数接口定义&#xff1a; 定义max函数&#xff0c;实现输出最高成绩对应的学号以及最高成绩值。 裁判测试程序样…

安装及管理docker

文章目录 1.Docker介绍2.Docker安装3.免sudo设置4. 使用docker命令5.Images6.运行docker容器7. 管理docker容器8.创建image9.Push Image 1.Docker介绍 Docker 是一个简化在容器中管理应用程序进程的应用程序。容器让你在资源隔离的进程中运行你的应用程序。类似于虚拟机&#…

设计一个订单管理系统(OMS)系统100问?

发一个订单管理系统(OMS)是为了帮助企业有效管理订单流程、提升客户体验、优化供应链管理。一个完善的订单管理系统不仅仅是简单地记录和处理订单信息&#xff0c;更需要考虑到订单的全生命周期管理&#xff0c;包括订单的创建、支付、配送、售后等环节。在设计和开发订单管理系…

Vue.js+SpringBoot开发厦门旅游电子商务预订系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

H5 简单打赏台多合一支付收款HTML源码

源码名称&#xff1a;简单打赏台多合一支付收款HTML源码 源码介绍&#xff1a;一款简单的三合一收款码源码&#xff0c;只需要替换收款二维码即可 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/12170.html

AcWing 4261.孤独的照片

这道题其实也是和子串分值的题是一样的&#xff0c;运用贡献法的思路来算的。 这里需要强调一一点&#xff1a;这里的说的是不小于3的子序列&#xff0c;而不是全部序列。 所以&#xff0c;在我们算出来这个值之后&#xff0c;需要进行减法处理&#xff0c;首先需要减去只有一…

R语言——采用主成分分析PCA方法下的“S 模式 “矩阵从同步分类中提取度量指标

本教程将向您展示如何根据我们的综合分类计算一些指标。 PCA PCA(Principal Component Analysis,主成分分析)是一种常用的数据降维技术,用于从高维数据中提取最重要的特征。它通过将原始数据转换为一组新的正交变量,称为主成分,以捕捉数据中最大的方差。 PCA的具体步骤…

2024年华为OD机试真题-万能字符单词拼写-Java-OD统一考试(C卷)

题目描述: 有一个字符串数组words和一个字符串chars。 假如可以用chars中的字母拼写出words中的某个“单词”(字符串),那么我们就认为你掌握了这个单词。 words的字符仅由 a-z 英文小写字母组成。 例如: abc chars 由 a-z 英文小写字母和 “?”组成。其中英文问号“?”表…

UE5.2 SmartObject使用实践

SmartObject是UE5新出的一项针对AI的功能&#xff0c;可为开发者提供如公园长椅、货摊等交互对象的统一外观封装&#xff0c;如UE的CitySample&#xff08;黑客帝国Demo&#xff09;中就运用到了SmartObject。 但SmartObject实践起来较为繁琐&#xff0c;主要依赖于AI及行为树…

C++_可变参数模板

目录 1、可变参数模板的用法 2、参数包展开 2.1 递归方式展开 2.2 逗号表达式形式展开 3、参数包的大小 结语 前言&#xff1a; C11引入了可变参数模板&#xff0c;他的作用是可以让创建的函数模板或者类模板的模板参数可以接收任意数量参数&#xff0c;在C11前&#x…

微信小程序-自定义简易顶部导航

创建component文件夹 创建navigation文件夹&#xff0c;创建navigation组件 navigation.json {"component": true,"usingComponents": {} }navigation.wxml <view class"navigation"><van-icon wx:if"{{showBack}}" custom…

C语言初学10:typedef

一、作用 为用户定义的数据类型取一个新名字 二、对结构体使用typedef定义新的数据类型名字 #include <stdio.h> #include <string.h>typedef struct Books //使用 typedef 来定义一个新的数据类型名字 {char title[50];} book;int main( ) {//book是typedef定…

【Scrapy】京东商品数据可视化

【Scrapy】京东商品数据可视化 文章目录 【Scrapy】京东商品数据可视化  &#x1f449;引言&#x1f48e;一、爬取数据&#xff1a;1.1 scrapy爬虫库简介&#xff1a;1.2 技术实现&#xff1a;1.2.1搭建框架结构1.2.2 分析网页结构 二、数据保存&#xff1a;三、数据读取以及…

回归预测 | Matlab实现BiTCN-BiGRU-Attention双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

回归预测 | Matlab实现BiTCN-BiGRU-Attention双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现BiTCN-BiGRU-Attention双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.M…

使用scrapy爬取蜻蜓FM

创建框架和项目 ### 1. 创建虚拟环境 conda create -n spiderScrapy python3.9 ### 2. 安装scrapy pip install scrapy2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple### 3. 生成一个框架并进入框架 scrapy startproject my_spider cd my_spider### 4. 生成项目 scrapy …

DFS例题(n皇后问题)C++(Acwing)

代码&#xff1a; #include <iostream>using namespace std;const int N 20;int n; char g[N][N]; bool col[N], dg[N], udg[N];void dfs(int u) {if(u n){for(int i 0; i < n; i) puts(g[i]);puts("");return; }for(int i 0; i < n…

[java入门到精通] 19 网络编程,设计模式

今日目标 网络编程 TCP通信 Junit单元测试 单例设计模式 多例设计模式 工厂设计模式 1 网络编程 1.1 软件架构 C/S结构 &#xff1a;全称为Client/Server结构&#xff0c;是指客户端和服务器结构。常见程序有&#xff31;&#xff31;、迅雷等软件B/S结构 &#xff1a…

C/C++关键字详解-----`const`的使用

作为一个关键词&#xff0c;你可以将 const 视为对数据的权限控制机制之一&#xff0c;它主要用于限制数据的可变性&#xff0c;从而提高代码的安全性和可靠性。通过使用 const&#xff0c;可以缩小对数据的修改权限&#xff0c;确保数据在某些情况下不被意外修改。 而根据使用…

【Python数据结构与判断1/7】复杂的多向选择

目录 导入 举个栗子 代码优化 elif 栗子 执行顺序 情况一 情况二 情况三 if-elif-else特性 三种判断语句小结 if if-else if-elif-else 嵌套语句 if嵌套 栗子 执行顺序 相互嵌套 Tips Debug 总结 导入 在前面&#xff0c;我们学习了单向选择的if语句和多项…

第四节:SashulinMessageBroker的团队协作

SMB工程可以通过git或svn等工具进行管理。除此外&#xff0c;SMB也提供了云代码管理功能。实际效果如图&#xff1a; 一、准备工作 1、代码管理相关的表结构 以下是云代码管理表结构&#xff0c;在mysql中运行。 -- Create syntax for TABLE sc_flow CREATE TABLE sc_flow (…