10 KiB
配置存储
**本文档引用的文件** - [AliyunSettingProvider.cs](file://aspnet-core/framework/cloud-aliyun/LINGYUN.Abp.Aliyun/LINGYUN/Abp/Aliyun/Settings/AliyunSettingProvider.cs) - [VueVbenAdminSettingDefinitionProvider.cs](file://aspnet-core/modules/platform/LINGYUN.Platform.Settings.VueVbenAdmin/LINGYUN/Platform/Settings/VueVbenAdmin/VueVbenAdminSettingDefinitionProvider.cs) - [ISettingAppService.cs](file://aspnet-core/framework/settings/LINGYUN.Abp.SettingManagement.Application.Contracts/LINGYUN/Abp/SettingManagement/ISettingAppService.cs) - [SettingDefinitionDto.cs](file://aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/Dto/SettingDefinitionDto.cs) - [SettingDefinitionAppService.cs](file://aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingDefinitionAppService.cs) - [SettingDto.cs](file://aspnet-core/framework/settings/LINGYUN.Abp.SettingManagement.Application.Contracts/LINGYUN/Abp/SettingManagement/Dto/SettingDto.cs) - [20231012032107_Initial-Single-Project.Designer.cs](file://aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/20231012032107_Initial-Single-Project.Designer.cs)目录
简介
本项目基于ABP框架实现了完整的配置管理系统,支持配置数据的持久化存储、加密保护、多租户隔离和性能优化。系统通过ABP的设置管理模块,将配置信息存储在数据库中,并提供灵活的API接口进行配置的读取和更新。配置系统支持全局、租户和用户级别的配置管理,确保不同层级的配置能够正确继承和覆盖。
配置数据持久化机制
ABP框架的设置系统通过实体框架(Entity Framework Core)将配置数据持久化到数据库中。系统定义了两种主要的数据库表来存储配置信息:AbpSettingDefinitions用于存储配置定义,AbpSettings用于存储配置值。配置定义表包含配置项的元数据,如名称、默认值、显示名称、描述等;配置值表则存储实际的配置值,支持不同提供者(如全局、租户、用户)的配置值存储。
配置系统支持多种配置提供者,包括默认值提供者、配置文件提供者、全局设置提供者和租户设置提供者。这些提供者按照优先级顺序进行配置值的查找和合并,确保配置的灵活性和可扩展性。当应用程序启动时,系统会从数据库中加载所有配置定义,并将其缓存到内存中,以提高配置读取的性能。
配置数据持久化流程:
- 应用程序启动时,从数据库加载配置定义
- 配置定义被缓存到内存中
- 当需要读取配置时,按优先级顺序从不同提供者获取配置值
- 配置值的更新会持久化到数据库
本节来源
- SettingDefinitionAppService.cs
- 20231012032107_Initial-Single-Project.Designer.cs
设置值加密存储策略
为了保护敏感配置信息,系统实现了配置值的加密存储机制。在配置定义中,可以通过设置IsEncrypted属性来指定某个配置项是否需要加密存储。当IsEncrypted为true时,配置值在存储到数据库之前会被加密,读取时会自动解密。
加密功能由_stringEncryptionService服务提供,该服务使用安全的加密算法对配置值进行加密和解密。在创建或更新配置定义时,如果IsEncrypted属性为true,系统会自动调用加密服务对默认值进行加密。当通过API获取配置值时,系统会自动检测配置项的加密状态,并在返回给客户端之前进行解密。
这种加密机制确保了敏感配置信息(如API密钥、密码等)在数据库中的安全存储,即使数据库被非法访问,攻击者也无法直接获取明文配置值。
sequenceDiagram
participant Client as "客户端"
participant Service as "配置服务"
participant Encryption as "加密服务"
participant DB as "数据库"
Client->>Service : 创建加密配置
Service->>Encryption : 加密配置值
Encryption-->>Service : 返回加密值
Service->>DB : 存储加密配置
DB-->>Service : 存储成功
Service-->>Client : 返回配置信息
Client->>Service : 读取加密配置
Service->>DB : 查询配置值
DB-->>Service : 返回加密值
Service->>Encryption : 解密配置值
Encryption-->>Service : 返回明文值
Service-->>Client : 返回解密后的配置
图表来源
- SettingDefinitionAppService.cs
- SettingDefinitionDto.cs
本节来源
- AliyunSettingProvider.cs
- VueVbenAdminSettingDefinitionProvider.cs
多租户环境下的配置隔离
在多租户环境中,系统通过租户ID来隔离不同租户的配置数据。每个租户都有独立的配置空间,确保配置数据的相互独立。系统支持三种级别的配置:全局配置、租户配置和用户配置。全局配置对所有租户生效,租户配置仅对特定租户生效,用户配置则针对特定用户。
当读取配置时,系统会按照以下优先级顺序进行查找:
- 用户配置(最高优先级)
- 租户配置
- 全局配置
- 默认值(最低优先级)
这种优先级机制确保了配置的灵活性,允许租户和用户根据需要覆盖上级配置。在数据库中,AbpSettings表通过ProviderName和ProviderKey字段来区分不同提供者的配置值。对于租户配置,ProviderName为TenantSettingValueProvider,ProviderKey为租户ID;对于用户配置,ProviderName为UserSettingValueProvider,ProviderKey为用户ID。
graph TD
A[配置读取] --> B{是否存在用户配置?}
B --> |是| C[返回用户配置]
B --> |否| D{是否存在租户配置?}
D --> |是| E[返回租户配置]
D --> |否| F{是否存在全局配置?}
F --> |是| G[返回全局配置]
F --> |否| H[返回默认值]
图表来源
- ISettingAppService.cs
- 20231012032107_Initial-Single-Project.Designer.cs
本节来源
- SettingDefinitionAppService.cs
- 20231012032107_Initial-Single-Project.Designer.cs
性能优化与缓存策略
为了提高配置系统的性能,系统实现了多层缓存机制。首先,配置定义在应用程序启动时被加载到内存中,并在整个应用程序生命周期内保持缓存。其次,配置值的读取也通过ABP框架的缓存机制进行优化,避免频繁的数据库查询。
系统使用ABP框架提供的ICacheManager服务来管理配置缓存。当配置值被读取时,系统首先检查缓存中是否存在该配置,如果存在则直接返回缓存值,否则从数据库查询并将其存入缓存。缓存的过期策略可以根据需要进行配置,确保配置更新能够及时生效。
此外,系统还支持配置的批量读取和更新,减少数据库交互次数。通过GetAllForCurrentTenantAsync和SetCurrentTenantAsync等API,可以一次性获取或更新多个配置项,提高操作效率。
本节来源
- SettingDefinitionAppService.cs
- SettingDto.cs
配置管理API接口
系统提供了RESTful API接口来管理配置,支持配置的创建、读取、更新和删除操作。主要API接口包括:
GET /api/setting-management/settings/by-global:获取全局配置PUT /api/setting-management/settings/by-global:设置全局配置GET /api/setting-management/settings/by-current-user:获取当前用户配置PUT /api/setting-management/settings/by-current-user:设置当前用户配置GET /api/setting-management/definitions/{name}:获取特定配置定义PUT /api/setting-management/definitions/{name}:更新特定配置定义
这些API接口通过ABP框架的模块化设计实现,位于LINGYUN.Abp.SettingManagement.HttpApi模块中。接口使用标准的HTTP方法和状态码,便于前端应用集成。所有写操作都需要相应的权限验证,确保配置的安全性。
本节来源
- ISettingAppService.cs
- [SettingDefinitionAppService.cs](file://aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement