最近在研究etcd的权限机制,etcd用的认证方式比较简单basic auth。原理也比较简单易懂,但轻率上线后,发现一个大坑,就是认证时候用来比较密码的哈希是bcript,而且是每个请求都会调。这个耗时很大,导致集群性能下降的厉害,基本不能用了。
查遍官方文档,说3.1+ 用https common name的方式可以解决这个问题,但是我就不想上https,涉及改造的工作量有点大,就想通过auth简单的把误操作的行为隔离一下。
于是乎只能开始动手改了,简单的加一个cache先用。
首先我们用的etcd版本为2.1.1
git clone https://github.com/coreos/etcd.git
git checkout v2.1.1
下载代码后,切换到 v2.1.1 tag下
打开目录 etcdserver
在目录下添加新文件,姑且叫做 password_map.go
添加如下代码
// author:ZeaLoVe // password map of etcd v2 api package auth import ( "fmt"
"sync"
) // key : string meke by hashed password + plaintext password // value: error the result of CompareHashAndPassword type PasswordMap struct { sync.RWMutex
M map[string]error
} var DefaultPasswdMap = PasswordMap{ M: make(map[string]error),
} func (this *PasswordMap) Hit(hashed, pt string) bool { this.RLock()
defer this.RUnlock()
if _, ok := this.M[hashed+pt]; ok {
return ok
}
return false
} // Get must called after Hit func (this *PasswordMap) Get(hashed, pt string) error { this.RLock()
defer this.RUnlock()
if val, ok := this.M[hashed+pt]; ok {
return val
}
return fmt.Errorf("no hit")
} func (this *PasswordMap) Set(hashed string, pt string, err error) { if hashed == "" {
return
}
this.Lock()
defer this.Unlock()
this.M[hashed+pt] = err
} |
打开该文件夹下的auth.go 找到 CheckPassword函数
修改为
func (u User) CheckPassword(password string) bool { if DefaultPasswdMap.Hit(u.Password, password) {
return DefaultPasswdMap.Get(u.Password, password) == nil
}
err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
DefaultPasswdMap.Set(u.Password, password, err)
return err == nil
} |
对于其他版本,虽然实现上可能有些区别,但整个原理是一样的(我看过3.1的基本没怎么改变)。此改造不会影响第一次请求的耗时,但后面不会对相同的密码再次调用bcript,会直接返回缓存的结果,极大提高了性能
但该实现没有回收缓存的空间,所以如果有人对同一个账号用各种不同的密码轮番攻击,可能会导致内存持续上升。但经过压测,发现即使试十万次内存也只上涨不到30M。可以暂时忽略这个问题。
即使内存大到一定程度,重启也可以恢复。
相关推荐
通过以上步骤,我们可以构建一个集成了 Spring Boot 和 Shiro 的权限认证管理系统,能够实现用户登录、权限校验、会话管理等功能,同时利用缓存提升系统性能。在实际开发中,还可以根据需求扩展 Shiro 功能,例如...
Cache对系统性能的影响 Cache是计算机系统中的一种高速缓存存储器,用于存储经常访问的数据,以提高系统的性能。 Cache的大小对系统性能的影响是非常重要的。本文将通过实验获得的真实数据记录与分析,探讨Cache的...
《权限系统设计与实现——基于C#的通用框架》 在IT行业中,权限管理系统是构建安全、高效软件应用的关键组成部分。本资源“很经典的略通用的权限系统”提供了一个使用C#语言编写的通用权限系统源代码,适用于多种...
1. **认证**:认证是确定用户身份的过程。在Java Shiro中,通过Subject接口来处理认证事务。开发者可以定义自己的 Realm(域)来连接应用程序的数据源,如数据库,以验证用户名和密码。 2. **授权**:授权是确定...
Cache系统是计算机体系结构中一个重要的组成部分,它的存在显著提高了处理器处理数据的速度。Cache通常被内置于CPU中,利用快速的静态随机存取存储器(SRAM),因其比动态随机存取存储器(DRAM)快得多,被用来存储最近...
Linux系统内核的文件Cache管理机制是其高效运行的关键组件之一,尤其是在高性能计算场景中,Linux的主导地位离不开对文件I/O的优化。文件Cache管理的主要目标是提高数据访问速度和减少磁盘I/O,从而提升整体系统性能...
在这个场景中,我们将讨论如何在oslo_cache这个Python库中集成SASL安全认证。 oslo_cache是OpenStack项目的一个组件,它为OpenStack服务提供了一种统一的缓存接口,以提高性能和减少数据库压力。通常,oslo_cache会...
### 处理器系统中的Cache-Memory #### 一、Cache的重要性及其作用 在现代处理器系统中,Cache-Memory(通常简称为Cache)扮演着至关重要的角色。它位于内存层次结构的顶端,紧邻处理器核心,其目的是通过缓存最近...
1. 理解Cache的基础知识,如其作用和基本工作流程。 2. 探究Cache的容量、相联度和块大小如何影响性能。 3. 学习降低Cache失效率的策略及其益处。 4. 理解Cache失效的三种类型:强制性失效、容量失效和冲突失效。 5....
Cache数据库是一种高性能、基于对象和关系的数据库系统,由InterSystems公司开发,广泛应用于医疗、金融、政府等领域的实时信息系统。这个压缩包包含了关于Cache数据库的安装和编程的相关资料,对于学习和理解Cache...
PrimoCache是一款高效、实用的硬盘缓存软件,它通过在系统内存中创建虚拟缓存,显著提升硬盘读写性能,从而优化系统运行速度。然而,如同大多数试用软件一样,PrimoCache在一定时间内会进入过期状态,此时就需要利用...
【权限控制系统】是一种用于管理应用系统中用户访问权限的重要组件,它确保了只有授权的用户才能访问特定的资源和服务。在本项目中,基于SSM(Spring、SpringMVC、MyBatis)框架进行开发,这是一套常用的Java后端...
PC 系统高速缓冲存储器 Cache 的原理、设计及实现 Cache 的原理是基于程序访问的局部性,即程序在一个较短的时间间隔内产生的地址往往集中在存储器逻辑地址空间的很小范围内。因此,可以在主存和 CPU 之间设置一个...
**Cache数据库系统开发培训** 在IT领域,Cache数据库系统是一个重要的组成部分,特别是在高并发、实时数据处理和数据存储方面有着广泛的应用。Cache是由InterSystems公司开发的一种高性能、内存中的数据库管理系统...
在本“计算机体系结构cache实验报告”中,我们主要探讨了Cache存储过程的模拟和性能分析,重点关注了不同因素如关联方式、Cache容量、关联度和块大小对Cache性能的影响。实验采用控制变量法,通过操作系统试验中的...
Buffer Cache与Cache的区别在于,Buffer Cache特指Oracle数据库中的数据缓冲区,主要优化的是磁盘I/O,而Cache则涵盖了从硬件层面到操作系统层面的各种缓存机制,包括CPU缓存、文件系统的Page Cache等,其目标是提升...
### Cachecloud文档解析 #### 一、概述 **Cachecloud** 是一款专为 Redis 集群管理和操作设计的开源工具。...对于那些希望简化 Redis 集群管理流程的企业或团队而言,Cachecloud 无疑是一个值得考虑的选择。
计算机组成原理实验报告的核心内容是实现一个Cache模拟器,该模拟器用于研究和理解Cache的工作机制及其对系统性能的影响。实验主要包括以下几个方面的知识点: 1. **Cache的基本概念**:Cache是一种高速缓存存储器...
1. Cache数据库基础概念:Cache是InterSystems公司开发的一个高性能的对象数据库,适合处理大量数据和复杂数据结构,通常用于医疗、金融等行业的应用系统。Cache数据库支持多用户并发访问,且具备良好的事务管理能力...
Linux 操作系统中内存 buffer 和 cache 的区别 在 Linux 操作系统中,内存 buffer 和 cache 是两个重要的概念,它们都是占用内存的,但是它们的作用和特点却不同。本文将详细介绍内存 buffer 和 cache 的概念、区别...