当前位置: 首页 > news >正文

【设计模式之美】面向对象分析方法论与实现(一):需求分析方法论

文章目录

  • 一. 需求举例
  • 二. 对案例进行需求分析
    • 1. 第一轮基础分析
    • 2. 第二轮分析优化
    • 3. 第三轮分析优化
    • 4. 第四轮分析优化
    • 5. 最终确定需求
  • 三. 小结

本文主要描述:

面向对象的需求分析方法论

一. 需求举例

假设,你正在参与开发一个微服务。微服务通过 HTTP 协议暴露接口给其他系统调用,其实,其他系统通过 URL 来调用微服务的接口。

 

二. 对案例进行需求分析

针对鉴权这个功能的开发,我们该如何做需求分析?

1. 第一轮基础分析

最简单的解决方案就是,通过用户名 + 密码来做认证。

给每个允许访问我们服务的调用方,派发一个应用名(或者叫应用 ID、AppID)和一个对应的密码(或者叫秘钥)。调用方每次进行接口请求的时候,都携带自己的 AppID 和密码。微服务在接收到接口调用请求之后,会解析出 AppID 和密码,跟存储在微服务端的 AppID 和密码进行比对。如果一致,说明认证成功,则允许接口调用请求;否则,就拒绝接口调用请求。

 

2. 第二轮分析优化

因为密码是明文,暴露给了网络,所以是不安全的。

加密算法

那如果我们借助加密算法(比如 SHA),对密码进行加密之后,再传递到微服务端验证,是不是就可以了呢?
实际上,这样也是不安全的,因为加密之后的密码及 AppID,照样可以被未认证系统(或者说黑客)截获,未认证系统可以携带这个加密之后的密码以及对应的 AppID,伪装成已认证系统来访问我们的接口。这就是典型的“重放攻击”。


提出问题,然后再解决问题,是一个非常好的迭代优化方法。


借助 OAuth 的验证思路

调用方将请求接口的 URL 跟 AppID、密码拼接在一起,然后进行加密,生成一个 token
调用方在进行接口请求的的时候,将这个 token 及 AppID,随 URL 一块传递给微服务端。微服务端接收到这些数据之后,根据 AppID 从数据库中取出对应的密码,并通过同样的 token 生成算法,生成另外一个 token
用这个新生成的 token 跟调用方传递过来的 token 对比。如果一致,则允许接口调用请求;否则,就拒绝接口调用请求。

 

3. 第三轮分析优化

不过还是有重放攻击的可能,我们可以进一步优化 token 生成算法,引入一个随机变量,让每次接口请求生成的 token 都不一样。

我们可以选择时间戳作为随机变量。我们将 URL、AppID、密码、时间戳四者进行加密来生成 token。调用方在进行接口请求的时候,将 token、AppID、时间戳,随 URL 一并传递给微服务端。
 
微服务端在收到这些数据之后,会验证当前时间戳跟传递过来的时间戳,是否在一定的时间窗口内(比如一分钟)。如果超过一分钟,则判定 token 过期,拒绝接口请求。如果没有超过一分钟,则说明 token 没有过期,就再通过同样的 token 生成算法,在服务端生成新的 token,与调用方传递过来的 token 比对,看是否一致。如果一致,则允许接口调用请求;否则,就拒绝接口调用请求。

在这里插入图片描述

 

4. 第四轮分析优化

但仍然有重放攻击的可能

未认证系统可以在这一分钟的 token 失效窗口内,通过截获请求、重放请求,来调用我们的接口。

 

开发成本

不过,攻与防之间,本来就没有绝对的安全。我们能做的就是,尽量提高攻击的成本。这个方案虽然还有漏洞,但是实现起来足够简单,而且不会过度影响接口本身的性能(比如响应时间)。


权衡安全性、开发成本、对系统性能的影响,这个方案算是比较折中、比较合理的了。


 

其他细节

另外,如何在微服务端存储每个授权调用方的 AppID 和密码。

最容易想到的方案就是存储到数据库里,比如 MySQL。不过,开发像鉴权这样的非业务功能,最好不要与具体的第三方系统有过度的耦合。
针对 AppID 和密码的存储,我们最好能灵活地支持各种不同的存储方式,比如 ZooKeeper、本地配置文件、自研配置中心、MySQL、Redis 等。


我们不一定针对每种存储方式都去做代码实现,但起码要留有扩展点,保证系统有足够的灵活性和扩展性,能够在我们切换存储方式的时候,尽可能地减少代码的改动。


 

5. 最终确定需求

到此,需求已经足够细化和具体了。看如下描述

在这里插入图片描述

 

三. 小结

针对框架、类库、组件等非业务系统的开发,其中一个比较大的难点就是:


需求一般都比较抽象、模糊,需要你自己去挖掘,做合理取舍、权衡、假设,把抽象的问题具象化,最终产生清晰的、可落地的需求定义。


需求定义是否清晰、合理,直接影响了后续的设计、编码实现是否顺畅。所以,作为程序员,你一定不要只关心设计与实现,前期的需求分析同等重要。

 


需求分析的过程实际上是一个不断迭代优化的过程。我们不要试图一下就能给出一个完美的解决方案,而是先给出一个粗糙的、基础的方案,有一个迭代的基础,然后再慢慢优化,这样一个思考过程能让我们摆脱无从下手的窘境。


 

 

 
参考《设计模式之美》-- 王争

相关文章:

【设计模式之美】面向对象分析方法论与实现(一):需求分析方法论

文章目录 一. 需求举例二. 对案例进行需求分析1. 第一轮基础分析2. 第二轮分析优化3. 第三轮分析优化4. 第四轮分析优化5. 最终确定需求 三. 小结 本文主要描述: 面向对象的需求分析方法论 一. 需求举例 假设,你正在参与开发一个微服务。微服务通过 HTT…...

MySQL视图索引执行计划相关十五道面试题分享

目录 一. 视图 1.1 含义 1.2 操作 创建视图 修改视图 删除视图 查看视图 二. 索引 2.1 什么是索引 2.2 为什么要使用索引 2.3 优点 2.4 缺点 2.5 何时不适用索引 2.6 索引何时失效 三. 执行计划 3.1 什么是执行计划 3.2 执行计划的作用 四. 面试题 表结构 …...

vue绑定背景颜色或背景图片 和 nuxtjs动态设置background-image:

v-bind绑定样式表&#xff1a; ---------------------------------------------------------------------------------------------------- HTML写法: <div class"myItem" style"text-align:center; background-image:url(); background-size:auto 100% ;ba…...

案例099:基于微信小程序的外卖小程序的研究与开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

数据库的设计

理解数据库第二范式2NF的必备知识 关系数据库基础&#xff1a; 了解关系数据库的基本概念&#xff0c;包括表格、行、列、主键、外键等。 第一范式&#xff08;1NF&#xff09;&#xff1a; 在理解第二范式之前&#xff0c;首先要了解第一范式。第一范式要求表格中的每个列都包…...

数据比较时String未转成BigDecimal的坑

如果价格的字段是String&#xff0c;要转换成BigDecimal等数字再比较&#xff0c;用String比较会出现奇怪的错误。 这句话看起来很多余&#xff0c;但是实际写代码的时候确是很容易忽略。 比如价格这个字段封装在对象里&#xff0c;而你只是a.getPrice().compareTo(b.getPrice…...

MySQL第三战:CRUD,函数1以及unionunion all

目录 前言 一.CRUD 1.查询 概念&#xff1a; 语法 含义 2.新增 概念&#xff1a; 语法 含义&#xff1a; 3.修改 语法 含义 4.删除 语法 含义 二.函数 1.字符函数 2.数字函数 3.日期函数 4.聚合函数 三.union&union all 概念 语法 专业词解释 使用…...

业务项目中Echarts图表组件的封装实践方案

背景&#xff1a;如果我们的项目是一个可视化类/营销看板类/大屏展示类业务项目&#xff0c;不可避免的会使用到各种图表展示。那在一个项目中如何封装一个图表组件既能够快速复用、UI统一&#xff0c;又可以灵活扩充Echarts的各种复杂配置项配置就变得极为重要。 封装目标 符…...

鸿蒙开发之拖拽事件

一、拖拽涉及的方法 Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)//拖拽开始.onDragStart((event: DragEvent) > {console.log(drag event onDragStartevent.getX())})//拖拽进入组件范围&#xff0c;需要监听onDrop配合.onDragEnter((event: DragEvent) …...

C#使用纯OpenCvSharp部署yolov8-pose姿态识别

【源码地址】 github地址&#xff1a;https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-Pose算法是一种基于深度神经网络的目标检测算法&#xff0c;用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块&#xff0c;通过联合检测和姿势…...

[AutoSar]基础部分 RTE 04 数据类型的定义及使用

目录 关键词平台说明一、数据类型分类二、Adt三、Idt四、Base 数据类型五、units六、compu methods七、data constraint 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、数据…...

c#调试程序一次启动两个工程(多个工程)

概述 c# - Visual Studio : debug multiple projects at the same time? 以在解决方案中设置多个启动项目(右键单击解决方案&#xff0c;转到设置启动项目&#xff0c;选择多个启动项目)&#xff0c;并为包含在解决方案(无、开始、不调试就开始)。如果您将多个项目设置为开始…...

轻松搭建企业知识库:10款必备工具推荐

随着企业知识的不断积累和团队规模的扩大&#xff0c;如何高效地管理和利用这些知识成为了一个重要的问题。企业知识库作为一种有效的知识管理工具&#xff0c;可以帮助企业将分散的知识整合在一起&#xff0c;方便团队成员快速查找、学习和共享。接下来就分享10款很不错的企业…...

第三天学习记录

第二天 C++随便提一提重点学习编译原理选学离散数学形式语言与自动机理论数据结构C++ 随便提一提 C++面向对象编程。与强调算法的过程性编程(试图使问题满足语言的过程性方法)不同。面向对象编程强调的是数据,它试图让语言来满足问题的要求。其理念是设计与问题本质特征相对…...

内核线程创建-kthread_create

文章参考Linux内核线程kernel thread详解 - 知乎 大概意思就是早期创建内核线程&#xff0c;是交由内核处理&#xff0c;由内核自己完成&#xff08;感觉好像也不太对呢&#xff09;&#xff0c;创建一个内核线程比较麻烦&#xff0c;会导致内核阻塞。因此就诞生了工作队列以及…...

uniappVue3版本中组件生命周期和页面生命周期的详细介绍

一、什么是生命周期&#xff1f; 生命周期有多重叫法&#xff0c;有叫生命周期函数的&#xff0c;也有叫生命周期钩子的&#xff0c;还有钩子函数的&#xff0c;其实都是代表&#xff0c;在 Vue 实例创建、更新和销毁的不同阶段触发的一组钩子函数&#xff0c;这些生命周期函数…...

任务驱动式编程

main /** 模板代码*/#include "gd32f4xx.h" #include "systick.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include "main.h" #include "USART0.h" #include &quo…...

python数据可视化之折线图案例讲解

学习完python基础知识点&#xff0c;终于来到了新的模块——数据可视化。 我理解的数据可视化是对大量的数据进行分析以更直观的形式展现出来。 今天我们用python数据可视化来实现一个2023年三大购物平台销售额比重的折线图。 准备工作&#xff1a;我们需要下载用于生成图表的第…...

QT工具栏开始,退出

QT工具栏开始&#xff0c;退出 //初始化场景QMenuBar *bar menuBar();setMenuBar(bar);QMenu *startbar bar->addMenu("开始");QAction * quitAction startbar->addAction("退出");connect(quitAction , &QAction::triggered,[](){this->c…...

@Async正确使用姿势

Async注解可以使被修饰的方法成为异步方法&#xff0c;简单且方便&#xff0c;这篇文章将教你如何正确的使用它 先谈谈大多数人对Aysnc的认识&#xff1a; 如果直接使用Async&#xff0c;未指定线程池 并且 容器内也没有beanName为taskExecutor的bean&#xff0c;则会使…...

图像修复效率提升:设计师与开发者必备的7个开源AI模型应用技巧

图像修复效率提升&#xff1a;设计师与开发者必备的7个开源AI模型应用技巧 【免费下载链接】ComfyUI-BrushNet ComfyUI BrushNet nodes 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BrushNet 在数字创作与内容修复领域&#xff0c;如何快速高效地消除图像瑕疵…...

RPCS3完全攻略:从零开始打造你的PC端PS3游戏中心

RPCS3完全攻略&#xff1a;从零开始打造你的PC端PS3游戏中心 【免费下载链接】rpcs3 PS3 emulator/debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 还在为无法重温经典PS3游戏而烦恼吗&#xff1f;想要在电脑上体验《最后生还者》、《神秘海域》等索…...

3大核心功能构建反检测浏览器:Camoufox实战指南

3大核心功能构建反检测浏览器&#xff1a;Camoufox实战指南 【免费下载链接】camoufox &#x1f98a; Anti-detect browser 项目地址: https://gitcode.com/gh_mirrors/ca/camoufox 在当今数据驱动的时代&#xff0c;网站反爬虫系统日益严苛&#xff0c;传统浏览器在访问…...

Wan2.2-I2V-A14B在微信小程序开发中的应用:实时图片转视频功能实现

Wan2.2-I2V-A14B在微信小程序开发中的应用&#xff1a;实时图片转视频功能实现 1. 引言 "一张照片能变成视频吗&#xff1f;"这是很多社交类小程序用户常有的疑问。想象一下&#xff0c;用户在电商小程序上传商品图片后&#xff0c;系统自动生成一段展示视频&#…...

Qwen3-Reranker-0.6B效果展示:长文档片段(32K)语义匹配能力实测

Qwen3-Reranker-0.6B效果展示&#xff1a;长文档片段&#xff08;32K&#xff09;语义匹配能力实测 1. 引言&#xff1a;当搜索遇到“大海捞针” 你有没有过这样的经历&#xff1f;面对一份几十页的PDF报告&#xff0c;或者一个包含数千条记录的数据库&#xff0c;想快速找到…...

PyArmor解包终极指南:3种高效逆向分析技巧快速掌握代码解密核心技术

PyArmor解包终极指南&#xff1a;3种高效逆向分析技巧快速掌握代码解密核心技术 【免费下载链接】PyArmor-Unpacker A deobfuscator for PyArmor. 项目地址: https://gitcode.com/gh_mirrors/py/PyArmor-Unpacker PyArmor-Unpacker是一个专为Python开发者和安全研究人员…...

Vivado+Vitis双剑合璧:从零构建Zynq-7020的SD卡Linux系统启动镜像

VivadoVitis双剑合璧&#xff1a;从零构建Zynq-7020的SD卡Linux系统启动镜像 在嵌入式系统开发领域&#xff0c;Xilinx Zynq系列SoC凭借其独特的ARM处理器与FPGA可编程逻辑的完美结合&#xff0c;成为众多高性能嵌入式应用的理想选择。本文将带领开发者深入探索如何利用Vivado和…...

从拒稿到录用:一个生物医学工程研究生的UMB投稿实战复盘(含完整时间线与避坑点)

从拒稿到录用&#xff1a;一个生物医学工程研究生的UMB投稿实战复盘 第一次收到CIBM编辑部的秒拒邮件时&#xff0c;我正在实验室熬夜跑数据。屏幕上的"reject"字样像一盆冷水浇下来——这个被我寄予厚望的期刊&#xff0c;从投稿到拒稿只用了17天。作为生物医学工程…...

万兆NAS成本大揭秘:用MicroServer Gen8+二手X520网卡搭建全流程(含读写性能实测)

万兆NAS成本大揭秘&#xff1a;用MicroServer Gen8二手X520网卡搭建全流程&#xff08;含读写性能实测&#xff09; 在追求高速网络存储的时代&#xff0c;万兆NAS已成为技术爱好者的新宠。本文将带你深入了解如何以最低成本搭建一套性能不俗的万兆NAS系统&#xff0c;核心硬件…...

复盘与导出工具V9.0新功能实测:竞价选股与Excel导出最强风口全攻略

复盘与导出工具V9.0深度实战&#xff1a;解锁竞价选股与Excel导出的高阶玩法 对于股票分析爱好者来说&#xff0c;工具的每一次重大更新都意味着效率的跃升。V9.0版本带来的竞价选股条件设置和最强风口Excel导出两大功能&#xff0c;正在重新定义短线交易的数据处理方式。本文将…...