这是基于vue-vben-admin 模板适用于abp vNext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

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)

目录

  1. 简介
  2. 配置数据持久化机制
  3. 设置值加密存储策略
  4. 多租户环境下的配置隔离
  5. 性能优化与缓存策略
  6. 配置管理API接口
  7. 数据库存储结构
  8. 总结

简介

本项目基于ABP框架实现了完整的配置管理系统,支持配置数据的持久化存储、加密保护、多租户隔离和性能优化。系统通过ABP的设置管理模块,将配置信息存储在数据库中,并提供灵活的API接口进行配置的读取和更新。配置系统支持全局、租户和用户级别的配置管理,确保不同层级的配置能够正确继承和覆盖。

配置数据持久化机制

ABP框架的设置系统通过实体框架(Entity Framework Core)将配置数据持久化到数据库中。系统定义了两种主要的数据库表来存储配置信息:AbpSettingDefinitions用于存储配置定义,AbpSettings用于存储配置值。配置定义表包含配置项的元数据,如名称、默认值、显示名称、描述等;配置值表则存储实际的配置值,支持不同提供者(如全局、租户、用户)的配置值存储。

配置系统支持多种配置提供者,包括默认值提供者、配置文件提供者、全局设置提供者和租户设置提供者。这些提供者按照优先级顺序进行配置值的查找和合并,确保配置的灵活性和可扩展性。当应用程序启动时,系统会从数据库中加载所有配置定义,并将其缓存到内存中,以提高配置读取的性能。

配置数据持久化流程:

  1. 应用程序启动时,从数据库加载配置定义
  2. 配置定义被缓存到内存中
  3. 当需要读取配置时,按优先级顺序从不同提供者获取配置值
  4. 配置值的更新会持久化到数据库

本节来源

  • SettingDefinitionAppService.cs
  • 20231012032107_Initial-Single-Project.Designer.cs

设置值加密存储策略

为了保护敏感配置信息,系统实现了配置值的加密存储机制。在配置定义中,可以通过设置IsEncrypted属性来指定某个配置项是否需要加密存储。当IsEncryptedtrue时,配置值在存储到数据库之前会被加密,读取时会自动解密。

加密功能由_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来隔离不同租户的配置数据。每个租户都有独立的配置空间,确保配置数据的相互独立。系统支持三种级别的配置:全局配置、租户配置和用户配置。全局配置对所有租户生效,租户配置仅对特定租户生效,用户配置则针对特定用户。

当读取配置时,系统会按照以下优先级顺序进行查找:

  1. 用户配置(最高优先级)
  2. 租户配置
  3. 全局配置
  4. 默认值(最低优先级)

这种优先级机制确保了配置的灵活性,允许租户和用户根据需要覆盖上级配置。在数据库中,AbpSettings表通过ProviderNameProviderKey字段来区分不同提供者的配置值。对于租户配置,ProviderNameTenantSettingValueProviderProviderKey为租户ID;对于用户配置,ProviderNameUserSettingValueProviderProviderKey为用户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服务来管理配置缓存。当配置值被读取时,系统首先检查缓存中是否存在该配置,如果存在则直接返回缓存值,否则从数据库查询并将其存入缓存。缓存的过期策略可以根据需要进行配置,确保配置更新能够及时生效。

此外,系统还支持配置的批量读取和更新,减少数据库交互次数。通过GetAllForCurrentTenantAsyncSetCurrentTenantAsync等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