文件最后提交记录最后更新时间
docs: remove redundant section comments 28 天前
refactor!(protocols): 重构 ConfigurationManager 线程安全实现并完善文档 - 将 ConfigurationManager<T> 的线程安全实现从 Mutex + 普通变量重构为基于原子操作(AtomicOptionReference<T>、AtomicBool、AtomicReference<Box<DateTime>>),消除锁竞争,提升并发读取性能 - 实现 stale-while-revalidate 策略,getConfiguration() 在后台刷新时返回缓存配置,避免阻塞调用方,仅首次加载时阻塞等待 - 新增 firstLoad() 方法,使用 _firstLoadLock 保证只有一个线程发起首次请求,其余线程在锁上等待,避免重复加载 - 新增 triggerBackgroundRefresh() 方法,spawn 协程执行非阻塞刷新,使用 _isRefreshing 原子标志防止并发刷新 - 重构 requestRefresh() 节流机制,首次调用立即生效(_isFirstRefreshRequest),后续受 refreshInterval 限制,通过设置 _syncAfter 为过去时间触发下次 getConfiguration 刷新 - 使用 DateTime.nowUTC() 替换 DateTime.now(),确保跨时区的 UTC 基准时间计算一致性 - 新增泛型约束 where T <: Object,因为 AtomicOptionReference<T> 要求引用类型,值类型不支持 - 新增 address 空值检查,空字符串抛出 IllegalArgumentException - 修复 FileDocumentRetriever.getDocument() 资源泄漏,使用 try-with-resources 确保文件正确关闭 - 增强 HttpDocumentRetriever.getDocument() 错误处理,新增 ensureSuccessStatusCode() 检查,非成功状态码抛出异常 - 修正 HttpDocumentRetriever 异常类型,非 HTTPS 地址时从 UnsupportedException 改为 IllegalArgumentException - 修正 Utility.isHttps() 检查逻辑,从 startsWith("https") 改为 startsWith("https://"),避免误判 "httpserver" 等字符串 - 完全重写 README.md 为规范的库文档,新增特性表格、多场景使用示例(基本配置管理、HTTP 文档检索器、静态配置管理)、完整 API 参考表格(6 个公开类型的方法签名) - 新增 CHANGELOG.md,记录 v1.0.0 版本的破坏性变更、功能变更、新增特性和缺陷修复 - 新增完整单元测试套件(basic、concurrent、error、integration 四类测试),覆盖 ConfigurationManager、FileDocumentRetriever、HttpDocumentRetriever、StaticConfigurationManager 的核心功能 BREAKING CHANGE: IConfigurationManager<T>、ConfigurationManager<T>、StaticConfigurationManager<T> 现在要求泛型参数 T 必须是引用类型(where T <: Object);之前可以使用值类型,现在必须使用引用类型(类、接口等) Upstream: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet 2 个月前
docs: 批量更新各模块 README.md,遵循 cj-readme 规范 更新 soulsoft_extensions_*、soulsoft_identity_*、soulsoft_net_http、 soulsoft_serialization、soulsoft_web_* 等模块的 README.md 文档 1 个月前
docs(identity-protocols): 更新模块描述文案 - 调整 cjpm.toml 中的 description 文案以统一模块说明口径 - 精简表述并突出当前模块的核心职责 - 保持包元数据与仓库整体命名风格一致 2 个月前
README.md

soulsoft.identity.protocols

用于处理身份验证协议的抽象库,提供配置管理和文档检索的核心组件。

关于

soulsoft.identity.protocols 是一个用于处理身份验证协议的抽象库,它提供了获取、解析和管理身份验证配置信息所需的核心组件和接口。该库定义了协议处理的基础类型,包括配置管理器(IConfigurationManager)、文档检索器(IDocumentRetriever)、配置检索器(IConfigurationRetriever)等抽象类和接口。作为基础库,它为具体的协议实现(如 OpenID Connect、OAuth 2.0)提供核心支撑,而不是直接用于应用程序中的协议处理。

特性

特性 描述
🔄 自动刷新配置 ConfigurationManager 支持定时自动刷新和手动触发刷新,默认 5 分钟刷新间隔、12 小时自动刷新间隔
🔒 线程安全 ConfigurationManager 基于 MutexAtomicOptionReferenceAtomicBool 实现,支持并发访问
📄 多种文档源 提供 FileDocumentRetrieverHttpDocumentRetriever,支持从本地文件或 HTTP(S) 端点获取配置文档
🛡️ HTTPS 强制 HttpDocumentRetriever 默认要求 HTTPS,可配置关闭(用于测试)
🎯 静态配置 StaticConfigurationManager 提供不可变配置管理,适用于固定配置场景
🔌 可扩展设计 通过 IConfigurationRetriever<T> 接口支持自定义配置解析逻辑

ConfigurationManager 基于 Mutex 和原子操作实现,线程安全。

如何使用

基本配置管理

import soulsoft_identity_protocols.*

// 创建文档检索器
let documentRetriever = FileDocumentRetriever()

// 创建配置检索器(需自定义实现 IConfigurationRetriever<T>)
let configRetriever = MyConfigRetriever()

// 创建配置管理器
let manager = ConfigurationManager<MyConfig>(
    "path/to/config.json",
    documentRetriever,
    configRetriever,
    refreshInterval: Duration.minute * 5,
    automaticRefreshInterval: Duration.hour * 12
)

// 获取配置(首次调用会加载,后续返回缓存)
let config = manager.getConfiguration()

// 手动触发刷新
manager.requestRefresh()

使用 HTTP 文档检索器

import soulsoft_identity_protocols.*
import soulsoft_net_http.*

// 默认要求 HTTPS
let httpRetriever = HttpDocumentRetriever()

// 或自定义 HttpClient 和 HTTPS 要求
let customClient = HttpClient()
let httpRetriever2 = HttpDocumentRetriever(customClient, requireHttps: false)

// 使用 HTTP 检索器创建配置管理器
let manager = ConfigurationManager<MyConfig>(
    "https://example.com/config.json",
    httpRetriever,
    configRetriever
)

let config = manager.getConfiguration()

静态配置管理

import soulsoft_identity_protocols.*

// 创建静态配置管理器(配置不可变)
let config = MyConfig("fixed-value")
let staticManager = StaticConfigurationManager<MyConfig>(config)

// 获取配置(始终返回同一实例)
let result = staticManager.getConfiguration()

// requestRefresh 是空操作
staticManager.requestRefresh()

API 参考

IConfigurationManager

方法 说明
getConfiguration(): T 获取当前配置,首次调用会加载,后续返回缓存(可能触发后台刷新)
requestRefresh(): Unit 手动触发配置刷新,受 refreshInterval 节流限制

ConfigurationManager

方法/属性 说明
init(address: String, documentRetriever: IDocumentRetriever, configurationRetriever: IConfigurationRetriever<T>, refreshInterval!: Duration = DefaultRefreshInterval, automaticRefreshInterval!: Duration = DefaultAutomaticRefreshInterval) 构造函数,address 不能为空
getConfiguration(): T 获取配置,首次加载阻塞,后续返回缓存并可能触发后台刷新
requestRefresh(): Unit 手动触发刷新,首次调用立即生效,后续受 refreshInterval 节流
DefaultRefreshInterval 静态常量,默认刷新间隔 5 分钟
DefaultAutomaticRefreshInterval 静态常量,默认自动刷新间隔 12 小时

StaticConfigurationManager

方法 说明
init(configuration: T) 构造函数,传入固定配置
getConfiguration(): T 返回构造时传入的配置
requestRefresh(): Unit 空操作,不改变配置

IDocumentRetriever

方法 说明
getDocument(address: String): String 从指定地址获取文档内容

FileDocumentRetriever

方法 说明
getDocument(address: String): String 从本地文件读取内容,文件不存在或读取失败抛出异常

HttpDocumentRetriever

方法/属性 说明
init(requireHttps!: Bool = true) 构造函数,使用默认 HttpClient
init(httpClient: HttpClient, requireHttps!: Bool = true) 构造函数,使用自定义 HttpClient
getDocument(address: String): String 从 HTTP(S) 端点获取文档,非 HTTPS 地址在 requireHttps=true 时抛出异常
requireHttps: Bool 只读属性,是否要求 HTTPS

IConfigurationRetriever

方法 说明
getConfiguration(address: String, documentRetriever: IDocumentRetriever): T 使用文档检索器获取并解析配置

相关包

  • soulsoft_net_http - HTTP 客户端库,用于 HttpDocumentRetriever 实现

反馈与贡献

本项目由杭州颉创科技有限公司开发,以 MIT 许可证开源发布。欢迎在 GitCode 提交错误报告和贡献代码。

开源声明

本库的核心实现参考了 Microsoft.IdentityModel 中的配置管理模块,原始代码版权归 .NET Foundation 所有,遵循 MIT 许可证。