Repository navigation
Module Features Data And Security
本页回答:
coco-features/里和数据访问、请求身份、审计、接口文档相关的 6 个模块,各自的公开类型、扩展点、自动配置注册、配置属性与依赖。 依据:各模块pom.xml、src/main/java、META-INF实读,内容对应仓库main分支。每节按“坐标与路径 → 职责 → 公开类型 → 扩展点 → 自动配置 → 配置属性 → 依赖 → 测试 → 用户文档”组织。
| Feature id | 模块 | Feature 依赖(StandardCocoFeatures) |
Maven 依赖中的 Coco 模块 | 模块级开关(默认值) |
|---|---|---|---|---|
mybatis-plus |
coco-mybatis-plus |
无 |
coco-i18n、coco-exception、coco-spring-boot-autoconfigure;optional:coco-api、coco-context
|
coco.mybatis-plus.pagination.enabled=true;coco.mybatis-plus.datasource.enabled=false
|
security |
coco-security |
无 |
coco-exception、coco-i18n、coco-context、coco-spring-boot-autoconfigure;测试:coco-test
|
coco.security.web.enabled=true |
tenant |
coco-tenant |
mybatis-plus、security
|
coco-exception、coco-i18n、coco-context、coco-spring-boot-autoconfigure;optional:coco-mybatis-plus
|
coco.tenant.sql.enabled=true |
data-permission |
coco-data-permission |
mybatis-plus、security
|
同 tenant |
coco.data-permission.sql.enabled=false
|
audit |
coco-audit |
无 |
coco-i18n、coco-logging、coco-spring-boot-autoconfigure
|
coco.audit.enabled=true |
openapi |
coco-openapi |
web、security
|
coco-i18n、coco-spring-boot-autoconfigure
|
coco.openapi.enabled=true |
要点:
- 六个模块都使用
@ConditionalOnCocoFeature,所以禁用对应 Feature 后,自动配置在运行期也不会生效;coco.features.disabled的依赖传播(禁用mybatis-plus会连带禁用tenant、data-permission)见 Feature 机制。 -
tenant与data-permission在 Maven 里没有依赖coco-security,它们的securityFeature 依赖只存在于 Feature 计划层(StandardCocoFeatures)。对coco-mybatis-plus的依赖是 optional,MyBatis-Plus 相关的自动配置用@ConditionalOnClass保护。 - 六个模块都有消息资源包(
coco-feature-<名>-messages,含默认、_en_US、_zh_CN),通过各自自动配置里的CocoMessageBundleRegistrarBean 注册。包名带feature:io.github.coco.feature.<name>。 - 每个模块有一个空的标记类
Coco<Name>Feature(私有构造器,无成员),不是扩展点。
坐标与路径:coco-features/coco-mybatis-plus。
职责:MyBatis-Plus 分页、SQL 守卫与拦截器组装(pom:pagination, SQL guard, and interceptor composition)。业务 CRUD 仍由开发者或代码生成器产出,这里不做运行时 CRUD。
包(io.github.coco.feature.mybatisplus. 之后) |
类型 | 说明 |
|---|---|---|
| (根) |
CocoMybatisPlusAutoConfiguration、CocoMybatisPlusProperties、CocoMybatisPlusErrorCode
|
自动配置、属性、错误码 |
interceptor |
CocoMybatisPlusInterceptorFactory |
组装 MybatisPlusInterceptor
|
interceptor |
CocoMybatisPlusInterceptorCustomizer(函数式接口,customize(MybatisPlusInterceptor)) |
其他模块向拦截器链追加内部拦截器的扩展点;tenant、data-permission 与分页上下文都通过它接入 |
pagination |
CocoPages |
工具类:fromContext()(用当前 CocoPageContext 创建 Page,并应用排序)、of(page, size)、toCocoPage(IPage)(转成 coco-api 的 CocoPage) |
pagination |
CocoSortable(注解,@Target(FIELD),value() 为排序参数名) |
标记 Entity 字段可排序 |
pagination |
CocoMybatisPlusDbTypeResolver |
resolve(String) 把配置字符串解析为 DbType
|
pagination |
CocoPageContextInnerInterceptor |
beforeQuery 里把分页上下文自动注入到查询 |
pagination |
CocoMybatisPlusPaginationProperties、CocoPageContextMybatisPlusAutoConfiguration
|
分页属性与上下文接入配置 |
sqlguard |
CocoMybatisPlusSqlGuardProperties |
SQL 守卫属性 |
datasource |
CocoMybatisPlusDataSourceAutoConfiguration、CocoMybatisPlusDataSourceProperties、CocoDataSourceDefinitionProperties
|
动态多数据源的自动配置与属性(前缀 coco.mybatis-plus.datasource) |
datasource |
CocoRoutingDataSource(继承 AbstractRoutingDataSource,实现 CocoDataSourceRegistry) |
全局唯一的 @Primary 路由数据源;Bean 名称 dataSource 与 cocoRoutingDataSource
|
datasource |
CocoDataSource(注解,类/方法/接口/Mapper)、CocoDataSourceAspect、CocoDataSourcePointcut
|
声明式切换;切面顺序默认高于 @Transactional
|
datasource |
CocoDataSourceContextHolder、CocoDataSourceScope
|
栈式线程上下文:push、current、snapshotStack、runWith、callWith、wrap、wrapSupplier、clear
|
datasource |
CocoDataSourceDefinition(record,toString 对密码脱敏) |
单个数据源的不可变定义 |
datasource |
CocoDataSourceProvider、CocoDataSourceCreator、CocoDataSourceLoadBalancer、CocoDataSourceKeyResolver、CocoDataSourceRouter
|
多数据源的 5 个 SPI,默认实现见下文“扩展点” |
datasource |
CocoDataSourceRegistry |
运行期注册、替换、卸载数据源,查询数据源与分组拓扑 |
datasource |
CocoDataSourceMissingPolicy、CocoDataSourceTransactionPolicy、CocoDataSourceLoadBalanceStrategy
|
缺失策略、事务内切换策略、负载均衡策略枚举 |
分页链路:coco-web 的 CocoPageInterceptor 解析 page / size / sort → coco-context 的 CocoPageContextHolder → 本模块的 CocoPageContextInnerInterceptor 与 CocoPages → 结果可转为 CocoPage。
CocoMybatisPlusInterceptorFactory#create 的顺序:
- 容器里所有
InnerInterceptorBean(按orderedStream())。 - 所有
CocoMybatisPlusInterceptorCustomizer(按orderedStream())。 - SQL 守卫:
sql-guard.block-attack-enabled为 true 时加BlockAttackInnerInterceptor;illegal-sql-enabled为 true 时加IllegalSQLInnerInterceptor;并在日志里输出生产环境建议。 - 分页:
pagination.enabled为 true 时最后追加PaginationInnerInterceptor,源码注释的原因是避免分页插件提前改写 SQL。
| 想做什么 | 做法 |
|---|---|
| 追加自己的拦截器 | 声明 CocoMybatisPlusInterceptorCustomizer Bean,或直接声明 InnerInterceptor Bean |
| 整体替换拦截器 | 声明 MybatisPlusInterceptor Bean(mybatisPlusInterceptor 带 @ConditionalOnMissingBean) |
| 关闭分页上下文自动注入 | coco.mybatis-plus.pagination.context.enabled=false |
| 从数据库或配置中心加载数据源 | 声明 CocoDataSourceProvider Bean(可多个,按 Ordered 排序,同名时后者覆盖前者) |
| 更换连接池或处理密文凭据 | 声明 CocoDataSourceCreator Bean,替换 DefaultCocoDataSourceCreator
|
| 自定义分组负载均衡 | 声明 CocoDataSourceLoadBalancer Bean,替换由 load-balance-strategy 选出的默认实现 |
| 自定义路由键解析 | 声明 CocoDataSourceKeyResolver Bean,替换默认的字面量 + SpEL 解析 |
| 不用注解、按上下文路由 | 声明 CocoDataSourceRouter Bean,例如读取租户上下文 |
| 运行期增删数据源 | 注入 CocoDataSourceRegistry,调用 registerDataSource / unregisterDataSource;主数据源不可卸载,被替换或卸载的连接池会被关闭 |
默认关闭(coco.mybatis-plus.datasource.enabled=false)。启用后只暴露一个 @Primary 的 CocoRoutingDataSource,因此 MyBatis-Plus 只创建一个 SqlSessionFactory,分页、租户、数据权限、SQL 守卫都在同一条拦截器链上对所有物理数据源生效,不会为每个数据源重复输出 MyBatis-Plus 启动标识。
-
路由键来源:
CocoDataSourceRouter返回的键,默认取CocoDataSourceContextHolder栈顶;没有键时用primary。键可以是数据源名,也可以是分组名。 -
分组:
sources.<name>.group显式指定,否则按group-separator取名称前缀(slave_1、slave_2归入slave)。命中分组时由CocoDataSourceLoadBalancer选出具体数据源。 -
切面:
CocoDataSourceAspect同时解析方法、类、接口与 Mapper 代理上的@CocoDataSource(方法优先),解析结果按(方法,目标类)缓存;嵌套调用逐层压栈并在退出时恢复。 -
事务保护:
transaction-policy控制已激活本地事务内的跨源切换(reject默认,warn,allow)。切面默认排在@Transactional之前,所以最外层调用不会误报。 -
缺失策略:
missing-policy=fail(默认)在目标不存在时抛出DATASOURCE_NOT_FOUND;fallback-primary记录 WARN 并回退主数据源。 - 失败回收:启动时任一数据源创建失败、主数据源缺失或后一个 Provider 覆盖了同名数据源,已创建的连接池都会被关闭,不会泄漏。
-
凭据:
CocoDataSourceDefinition#toString对密码脱敏,附加属性只输出键名。 -
错误码:新增
INVALID_DATASOURCE_KEY、INVALID_DATASOURCE_DEFINITION、PRIMARY_DATASOURCE_MISSING、PRIMARY_DATASOURCE_UNREMOVABLE、DATASOURCE_NOT_FOUND、DATASOURCE_TRANSACTION_CONFLICT,消息在coco-feature-mybatis-plus-messages三个资源包中。
AutoConfiguration.imports:
-
io.github.coco.feature.mybatisplus.CocoMybatisPlusAutoConfiguration:after MybatisPlusAutoConfiguration、before MybatisPlusInnerInterceptorAutoConfiguration;@ConditionalOnCocoFeature(MYBATIS_PLUS)+@ConditionalOnClass(MybatisPlusInterceptor);Bean:cocoMybatisPlusMessageBundleRegistrar、mybatisPlusInterceptor。 -
io.github.coco.feature.mybatisplus.datasource.CocoMybatisPlusDataSourceAutoConfiguration:before DataSourceAutoConfiguration、before MybatisPlusAutoConfiguration;@ConditionalOnCocoFeature(MYBATIS_PLUS)+@ConditionalOnClass(DataSource, AbstractRoutingDataSource)+coco.mybatis-plus.datasource.enabled=true(无缺省);Bean:cocoDataSourceCreator、propertiesCocoDataSourceProvider、cocoDataSourceLoadBalancer、cocoDataSourceRouter、cocoRoutingDataSource(别名dataSource,@Primary)、cocoDataSourceKeyResolver、cocoDataSourceAspect、cocoDataSourceAdvisor。除cocoRoutingDataSource以CocoRoutingDataSource类型、propertiesCocoDataSourceProvider与cocoDataSourceAdvisor以名称判断外,其余 Bean 都按类型@ConditionalOnMissingBean。 -
io.github.coco.feature.mybatisplus.pagination.CocoPageContextMybatisPlusAutoConfiguration:after CocoMybatisPlusAutoConfiguration;coco.mybatis-plus.pagination.context.enabled缺省 true;BeancocoPageContextInterceptorCustomizer。
当该 Feature 被禁用时,CocoFeatureAutoConfigurationImportFilter 还会过滤 MyBatis-Plus 官方的 5 个自动配置(见 Spring 组合层)。构建期 StandardCocoFeatures 对该 Feature 的裁剪集合除 coco-mybatis-plus 外还包括 mybatis、mybatis-spring 与一组 mybatis-plus-* 第三方 artifact(见 构建模块)。
coco.logging.quiet-spring=true(默认)时,CocoLoggingEnvironmentPostProcessor 还会把 mybatis-plus.global-config.banner 默认设为 false,业务显式配置优先;见 基础模块。
| 键 | 默认值 |
|---|---|
pagination.enabled |
true |
pagination.db-type |
空(自动解析) |
pagination.overflow |
false |
pagination.max-limit |
空 |
pagination.optimize-join |
true |
pagination.context.enabled |
缺省 true(条件属性,无字段) |
sql-guard.block-attack-enabled |
false |
sql-guard.illegal-sql-enabled |
false |
datasource.enabled |
false |
datasource.primary |
master |
datasource.missing-policy |
fail(fail / fallback-primary) |
datasource.transaction-policy |
reject(reject / warn / allow) |
datasource.load-balance-strategy |
round-robin(round-robin / random) |
datasource.group-separator |
_ |
datasource.aspect-order |
Ordered.HIGHEST_PRECEDENCE + 100 |
datasource.max-key-length |
128 |
datasource.sources.<name>.url / username / password / driver-class-name / type / group / properties.*
|
空;url 必填 |
有 META-INF/additional-spring-configuration-metadata.json。
测试:4 个 *Test(含多数据源的自动配置与路由测试,以及不依赖容器的基础组件测试)。用户文档:mybatis-plus、pagination。
坐标与路径:coco-features/coco-security。
职责:安全上下文 Feature(pom:Security context feature implementation)。它提供“当前主体是谁”的抽象与 Web 入口,不是认证实现——认证方案、权限模型属于下游应用(见 AGENTS.md)。
包(io.github.coco.feature.security. 之后) |
类型 | 说明 |
|---|---|---|
| (根) | CocoSecurity |
静态入口:current()、principal()、isAuthenticated()、requireCurrent()、requireAuthenticated()、requirePrincipal()、hasRole(role)、requireRole(role)、hasPermission(permission)、requirePermission(permission)
|
| (根) |
CocoSecurityAutoConfiguration、CocoSecurityProperties、CocoSecurityErrorCode
|
自动配置、属性、错误码 |
context |
CocoSecurityContext(record:principal、authenticated;authenticated(principal)、anonymous()) |
安全上下文 |
context |
CocoSecurityPrincipal(record;of(principalId, principalName)、hasRole、hasPermission、attribute) |
主体 |
context |
CocoSecurityContextHolder |
ThreadLocal 持有器,带 capture / restore / wrap / runWithContext / callWithContext
|
context |
CocoSecurityContextResolver(函数式接口,Optional<CocoSecurityContext> resolve())、HolderCocoSecurityContextResolver
|
非 Web 场景的上下文解析,默认读 Holder |
web |
CocoSecurityWebFilter |
Servlet 过滤器:用 CocoWebSecurityContextResolver 解析并写入 Holder |
web |
CocoWebSecurityContextResolver(函数式接口,resolve(HttpServletRequest))、HeaderCocoWebSecurityContextResolver
|
Web 场景的扩展点;默认实现从上游 HTTP 头读取主体 |
web |
CocoSecurityWebProperties、CocoSecurityWebHeaderProperties
|
属性 |
- 业务接入自己的认证:声明
CocoWebSecurityContextResolverBean(Servlet 场景,@ConditionalOnMissingBean),或在认证成功后自己调用CocoSecurityContextHolder.set(...);非 Web 场景声明CocoSecurityContextResolverBean。 - 默认的
HeaderCocoWebSecurityContextResolver信任上游传入的头(X-Coco-Principal-Id、X-Coco-Principal-Name、X-Coco-Roles、X-Coco-Permissions)。头解析默认关闭(web.header.enabled=false),开启时自动配置会输出 WARN:该解析器不得在没有可信网关的情况下直接暴露公网。需要提供自定义解析器 Bean 才会消除告警。
io.github.coco.feature.security.CocoSecurityAutoConfiguration:@ConditionalOnCocoFeature(SECURITY);Bean:cocoSecurityMessageBundleRegistrar、cocoSecurityContextResolver(默认 Holder)、cocoWebSecurityContextResolver(@ConditionalOnClass(Filter) + Servlet)、cocoSecurityWebFilterRegistration(FilterRegistrationBean<CocoSecurityWebFilter>,名称 cocoSecurityWebFilter,顺序 HIGHEST_PRECEDENCE + 5,条件 coco.security.web.enabled 缺省 true)。本模块没有 additional-spring-configuration-metadata.json(属性元数据由注解处理器生成)。
| 键 | 默认值 |
|---|---|
web.enabled |
true |
web.header.enabled |
false |
web.header.principal-id-header-name |
X-Coco-Principal-Id |
web.header.principal-name-header-name |
X-Coco-Principal-Name |
web.header.roles-header-name |
X-Coco-Roles |
web.header.permissions-header-name |
X-Coco-Permissions |
web.header.authority-delimiter |
"," |
测试:3 个 *Test;以 test 作用域依赖 coco-test(仓库里目前唯一的使用者)。用户文档:security-context。
坐标与路径:coco-features/coco-tenant。职责:租户上下文与 MyBatis-Plus 租户 SQL 隔离。租户模型(租户从哪来、怎么存)由业务决定,框架只提供上下文与 SQL 注入。
| 包 | 类型 | 说明 |
|---|---|---|
| (根) |
CocoTenantAutoConfiguration、CocoTenantProperties、CocoTenantErrorCode
|
自动配置、属性、错误码 |
context |
CocoTenantContext(record:tenantId、tenantName、attributes;of(id, name)、attribute(name)) |
租户上下文 |
context |
CocoTenantContextHolder |
current()、requireCurrent()、set、clear、capture、restore、wrap*、runWithContext、callWithContext
|
context |
CocoTenantContextResolver(函数式接口,Optional<CocoTenantContext> resolve())、HolderCocoTenantContextResolver
|
扩展点:自定义租户来源(如从 JWT / 请求头取) |
sql |
CocoTenantLineHandler |
把租户上下文转换为 MyBatis-Plus TenantLineHandler 所需的字段名、租户值、忽略表 |
sql |
CocoTenantIdExpressionResolver(函数式接口,Expression resolve(CocoTenantContext))、DefaultCocoTenantIdExpressionResolver
|
扩展点:租户值的 SQL 表达式 |
sql |
CocoTenantInterceptorIgnoreGuard(InnerInterceptor)、CocoTenantInterceptorIgnoreProperties、CocoTenantInterceptorIgnoreDecision、CocoTenantInterceptorIgnoreEvent、CocoTenantInterceptorIgnoreEventPublisher(函数式接口)、NoOpCocoTenantInterceptorIgnoreEventPublisher
|
忽略治理:检测 @InterceptorIgnore(tenantLine = true) 或线程级忽略,避免租户隔离被静默绕过;事件发布器可桥接到审计 / 告警 / 指标 |
sql |
CocoTenantSqlProperties、CocoTenantMybatisPlusAutoConfiguration
|
属性与接入配置 |
AutoConfiguration.imports:
-
io.github.coco.feature.tenant.CocoTenantAutoConfiguration:@ConditionalOnCocoFeature(TENANT);Bean:cocoTenantMessageBundleRegistrar、CocoTenantContextResolver(默认 Holder)。 -
io.github.coco.feature.tenant.sql.CocoTenantMybatisPlusAutoConfiguration:after {CocoTenantAutoConfiguration, CocoMybatisPlusAutoConfiguration};@ConditionalOnCocoFeature(TENANT);@ConditionalOnClass({TenantLineInnerInterceptor, CocoMybatisPlusInterceptorCustomizer});coco.tenant.sql.enabled缺省 true;Bean:CocoTenantIdExpressionResolver、cocoTenantMybatisPlusInterceptorCustomizer(先加CocoTenantInterceptorIgnoreGuard,再加TenantLineInnerInterceptor(CocoTenantLineHandler);事件发布器通过ObjectProvider取,缺省NoOp)。
| 键 | 默认值 |
|---|---|
enabled |
true |
tenant-id-column |
"tenant_id" |
ignore-tables |
空 |
fail-on-missing-context |
true(缺租户上下文默认失败) |
interceptor-ignore.block-unlisted |
true |
interceptor-ignore.allowed-mapped-statements |
空 |
忽略表与“放行的 MappedStatement”都需要显式配置。有 additional-spring-configuration-metadata.json。测试:3 个 *Test。用户文档:tenant。
坐标与路径:coco-features/coco-data-permission。职责:数据权限上下文与 MyBatis-Plus 数据权限 SQL 条件。SQL 注入默认关闭。
| 包 | 类型 | 说明 |
|---|---|---|
| (根) |
CocoDataPermissionAutoConfiguration、CocoDataPermissionProperties、CocoDataPermissionErrorCode
|
自动配置、属性、错误码 |
context |
CocoDataPermissionContext(record:rules;of(rules)、empty()、rule(resource)) |
数据权限上下文 |
context |
CocoDataPermissionRule(record:resource、scope、values;all(resource)、deny(resource)) |
单个资源的规则 |
context |
CocoDataScope(枚举:ALL、SELF、CUSTOM、DENY) |
数据范围 |
context |
CocoDataPermissionContextHolder、CocoDataPermissionContextResolver(函数式接口)、HolderCocoDataPermissionContextResolver
|
Holder 带 capture / restore / wrap* / runWithContext / callWithContext;Resolver 是自定义规则来源的扩展点 |
mybatisplus |
CocoMybatisPlusDataPermissionHandler、CocoDataPermissionMybatisPlusAutoConfiguration
|
接入 MyBatis-Plus DataPermissionInterceptor
|
sql |
CocoDataPermissionSqlPredicateProvider(函数式接口,Optional<Expression> predicate(CocoDataPermissionSqlPredicateContext))、DefaultCocoDataPermissionSqlPredicateProvider
|
扩展点:生成 SQL 谓词 |
sql |
CocoDataPermissionSqlResourceResolver(函数式接口,Optional<String> resolve(CocoDataPermissionSqlResourceContext))、PropertyCocoDataPermissionSqlResourceResolver
|
扩展点:把 SQL 表映射到资源名;默认读 sql.resources 配置 |
sql |
CocoDataPermissionMissingContextPolicy(THROW、DENY、IGNORE)、CocoDataPermissionMissingRulePolicy(DENY、IGNORE)、CocoDataPermissionSqlColumnType(STRING、LONG) |
策略与列类型 |
sql |
CocoDataPermissionSqlProperties、CocoDataPermissionSqlResourceProperties、CocoDataPermissionSqlPredicateContext、CocoDataPermissionSqlResourceContext
|
属性与上下文 |
-
io.github.coco.feature.datapermission.CocoDataPermissionAutoConfiguration:@ConditionalOnCocoFeature(DATA_PERMISSION);Bean:cocoDataPermissionMessageBundleRegistrar、CocoDataPermissionContextResolver(默认 Holder)。 -
io.github.coco.feature.datapermission.mybatisplus.CocoDataPermissionMybatisPlusAutoConfiguration:after {CocoDataPermissionAutoConfiguration, CocoMybatisPlusAutoConfiguration};@ConditionalOnCocoFeature(DATA_PERMISSION);@ConditionalOnClass(name = {DataPermissionInterceptor, CocoMybatisPlusInterceptorCustomizer});Bean:CocoDataPermissionSqlResourceResolver、CocoDataPermissionSqlPredicateProvider,以及仅在coco.data-permission.sql.enabled=true时创建的cocoDataPermissionMybatisPlusInterceptorCustomizer(加DataPermissionInterceptor(CocoMybatisPlusDataPermissionHandler))。
| 键 | 默认值 |
|---|---|
enabled |
false |
missing-context-policy |
THROW(缺上下文时抛框架异常;DENY 追加永假条件;IGNORE 不加条件) |
missing-rule-policy |
DENY(缺资源规则时追加永假条件;IGNORE 不加条件) |
resources.<name>.tables |
空列表 |
resources.<name>.column |
无 |
resources.<name>.column-type |
STRING(另有 LONG) |
有 additional-spring-configuration-metadata.json。测试:4 个 *Test。用户文档:data-permission。
坐标与路径:coco-features/coco-audit。职责:审计事件发布管道、默认结构化日志、格式化与记录器 SPI,以及把访问日志转成审计事件的适配器。设计规格:coco-support/coco-document/superpowers/specs/2026-07-10-coco-audit-feature-independence.md、2026-07-10-coco-default-audit-logging.md。
| 包 | 类型 | 说明 |
|---|---|---|
| (根) |
CocoAuditAutoConfiguration、CocoAuditProperties
|
自动配置与属性 |
core |
CocoAuditEvent(不可变;builder(type),可选字段 action、resourceType、resourceId、traceId、actor、tenantId、success、occurredAt、attribute(name, value)) |
审计事件 |
core |
CocoAuditPublisher(函数式接口,publish(event))、CompositeCocoAuditPublisher
|
发布器;组合发布器把事件分发给所有记录器 |
core |
CocoAuditRecorder(函数式接口,record(event))、LoggingCocoAuditRecorder、NoOpCocoAuditRecorder
|
记录器 SPI:业务可注册多个,写数据库 / MQ 等 |
core |
CocoAuditFormatter(函数式接口,String format(event))、DefaultCocoAuditFormatter
|
格式化 SPI |
core |
CocoAuditErrorHandler(函数式接口,handle(event, recorder, failure))、PolicyCocoAuditErrorHandler、CocoAuditFailurePolicy(IGNORE、THROW) |
记录失败处理 |
accesslog |
CocoAccessLogAuditRecorder |
把 coco-logging 的 CocoAccessLogRecorder 适配为审计事件 |
io.github.coco.feature.audit.CocoAuditAutoConfiguration:@AutoConfiguration(after = CocoCommonLoggingAutoConfiguration);@ConditionalOnCocoFeature(AUDIT)。Bean(都带 @ConditionalOnMissingBean 并受 coco.audit.enabled 缺省 true 控制):
-
cocoAuditLogHandleRegistrar:注册审计日志句柄(coco.audit.logging.enabled)。 -
cocoAuditFormatter:CocoAuditFormatter。 -
cocoAuditRecorder:默认日志记录器,要求容器里有CocoLogManager且coco.audit.logging.enabled;已有其他CocoAuditRecorder时不创建。 -
cocoAuditErrorHandler:按failure-policy处理。 -
cocoAuditPublisher:@ConditionalOnBean(CocoAuditRecorder),收集所有CocoAuditRecorder。 -
cocoAccessLogAuditRecorder:CocoAccessLogRecorder,条件coco.audit.access-log.enabled缺省 true,依赖CocoAuditPublisher。
| 键 | 默认值 |
|---|---|
enabled |
true |
failure-policy |
IGNORE(另有 THROW) |
logging.enabled |
true |
logging.logger-name |
io.github.coco.audit |
logging.level |
INFO |
access-log.enabled |
true |
有 additional-spring-configuration-metadata.json。测试:3 个 *Test。用户文档:audit。
坐标与路径:coco-features/coco-openapi。职责:OpenAPI 元数据提供器;在 classpath 上有 SpringDoc 时把 Coco 元数据适配进去(见 AGENTS.md)。模块自身不依赖 SpringDoc。
| 包 | 类型 | 说明 |
|---|---|---|
| (根) |
CocoOpenApiAutoConfiguration、CocoOpenApiProperties
|
自动配置与属性 |
core |
CocoOpenApiMetadata(record:title、version、description) |
元数据 |
core |
CocoOpenApiMetadataProvider(函数式接口,metadata())、DefaultCocoOpenApiMetadataProvider
|
扩展点:自定义元数据来源 |
springdoc |
CocoSpringDocOpenApiCustomizerFactoryBean(FactoryBean<Object>) |
用代理按名称适配 org.springdoc.core.customizers.OpenApiCustomizer,避免编译期依赖 SpringDoc |
io.github.coco.feature.openapi.CocoOpenApiAutoConfiguration:afterName 为 CocoWebAutoConfiguration 与 CocoSecurityAutoConfiguration;@ConditionalOnCocoFeature(OPENAPI);Bean:cocoOpenApiMessageBundleRegistrar、CocoOpenApiMetadataProvider(条件 coco.openapi.enabled 缺省 true)、cocoSpringDocOpenApiCustomizer(需要 OpenApiCustomizer、OpenAPI、Info 三个类在 classpath 上,且 coco.openapi.springdoc.enabled 缺省 true)。
| 键 | 默认值 |
|---|---|
enabled |
true |
info.title |
"Coco API" |
info.version |
"1.0.0" |
info.description |
"Coco Framework API" |
springdoc.enabled |
true |
有 additional-spring-configuration-metadata.json。测试:2 个 *Test(另有 3 个非 *Test 命名的辅助 Java 文件)。用户文档:openapi。
仓库 · CHANGELOG · CONTRIBUTING · GOVERNANCE · SECURITY · 许可证 Apache-2.0
本 Wiki 镜像自仓库的 docs/wiki 目录,请通过 PR 修改,不要在网页上直接编辑。
开始
架构
模块参考
约定与指南
速查与排障
仓库