Apereo CAS Not Prevented 认证策略:原理、配置与 fail-closed 实战
后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载导读在 Apereo CAS 的多种认证策略Authentication Policy中Not Prevented策略提供了一种“在不确定的安全事件面前宁可失败”的判定语义仅当认证事件没有被PreventedException阻塞时才判定为满足。本文以官方文档 Configuring-Authentication-Policy-NotPrevented.md 为核心骨架结合源码实现、配置属性模型与单元测试深入讲解该策略的适用场景、配置方式、底层判定逻辑以及它与“至少一个凭证通过”策略的继承关系帮助你准确决定何时启用它。一、策略语义什么时候算“满足”官方文档对该策略的定义只有一句话但语义非常精确Satisfied if and only if the authentication event is not blocked by aPreventedException.即当且仅当认证事件未被PreventedException阻塞时该策略才被满足。这里的“阻塞”并不等于“认证失败”——它是认证基础设施层面的一种特殊错误状态。PreventedException是什么PreventedException定义在 api/cas-server-core-api-authentication/src/main/java/org/apereo/cas/authentication/PreventedException.java源码注释明确说明Describes an error condition where authentication was prevented for some reason, e.g. communication error with back-end authentication store.也就是说它描述的是“认证因某种原因被阻止”的错误条件典型的例子是与后端认证存储如 LDAP、数据库发生通信错误。这类错误不同于“用户名或密码错误”——后者是确定性的业务失败而前者属于不确定性的系统级异常。它携带固定错误码public static final String CODE BLOCKED_AUTHN_REQUEST;当认证处理器在无法确定用户凭据是否有效例如后端不可达时抛出PreventedExceptionCAS 会将其记录到认证事件的失败列表Authentication.getFailures()中。一句话概括Not Prevented策略 “至少有一个凭证认证成功”且“没有出现PreventedException阻塞”。只要出现任何被阻止的认证尝试无论其他凭据是否成功策略整体判定为不满足。二、源码实现NotPreventedAuthenticationPolicy策略的完整实现位于 core/cas-server-core-authentication-api/src/main/java/org/apereo/cas/authentication/policy/NotPreventedAuthenticationPolicy.java。继承关系public class NotPreventedAuthenticationPolicy extends AtLeastOneCredentialValidatedAuthenticationPolicy它直接继承自AtLeastOneCredentialValidatedAuthenticationPolicy实现见 AtLeastOneCredentialValidatedAuthenticationPolicy.java并在构造函数中强制传入tryAll truepublic NotPreventedAuthenticationPolicy() { super(true); }这一点非常关键父类中tryAll标志为true时策略要求所有有资格处理本次认证事务的处理器handler都完成一次成功的认证而不仅仅是“至少一个成功”。因此Not Prevented实际上是比AtLeastOneCredentialValidated更严格的一种“fail-closed故障关闭”变体——源码注释对此有明确说明This policy may be a desirable alternative toAtLeastOneCredentialValidatedAuthenticationPolicyfor cases where deployers wish to fail closed for indeterminate security events.核心判定逻辑isSatisfiedBy方法分两步判定if (authentication null) { LOGGER.warn(Authentication attempt is null and cannot satisfy policy); return AuthenticationPolicyExecutionResult.failure(); } val fail authentication.getFailures() .values() .stream() .anyMatch(failure - failure.getClass().isAssignableFrom(PreventedException.class)); if (fail) { LOGGER.warn(Authentication policy has failed given at least one authentication failure is found to prevent authentication); return AuthenticationPolicyExecutionResult.failure(); } return super.isSatisfiedBy(authentication, authenticationHandlers, applicationContext, context);逻辑顺序为空认证直接失败认证事件为null时记录 WARN 并返回失败扫描失败列表遍历authentication.getFailures()只要存在一个PreventedException或其子类通过isAssignableFrom判断立即判定策略失败委托父类没有阻止性异常时交给父类的AtLeastOneCredentialValidated逻辑此时tryAlltrue要求所有 handler 均有成功记录且成功列表非空。从源码结构可以推断正是第 2 步的“一票否决”式检查实现了文档所述的 “not blocked by aPreventedException” 语义哪怕有一个凭据因系统错误被阻止整个策略也不满足。单元测试验证策略行为在 NotPreventedAuthenticationPolicyTests.java 中有两个反向验证用例标记Tag(AuthenticationPolicy)verifyOperationPrevented构建一个带PreventedException失败的认证事件断言isSatisfiedBy返回失败verifyOperationNotPrevented构建一个无成功记录、也无被阻止异常的认证事件断言策略仍然返回失败因为tryAlltrue下没有任何成功事务。两个用例共同印证该策略既拒绝“被阻止”的认证也拒绝“没有成功”的认证是双重收紧的 fail-closed 语义。三、全局启用cas.authn.policy.not-prevented配置策略的全局配置属性集中在cas.authn.policy.not-prevented命名空间下官方文档通过{% include_cached casproperties.html propertiescas.authn.policy.not-prevented %}自动渲染完整属性表。属性模型定义在 NotPreventedAuthenticationPolicyProperties.java其本身没有额外字段全部继承自 BaseAuthenticationPolicyProperties.java属性类型默认值说明cas.authn.policy.not-prevented.enabledbooleanfalse是否启用该策略。只有设为true时该策略才会被装配cas.authn.policy.not-prevented.nameString空认证策略名称便于日志与审计识别cas.authn.policy.not-prevented.orderintOrdered.LOWEST_PRECEDENCE策略在多策略组合中的执行顺序数值越小优先级越高典型配置示例application.ymlcas: authn: policy: not-prevented: enabled: true name: NotPreventedPolicy order: 10属性如何被装配为策略对象cas.authn.policy.not-prevented在配置模型中挂载于 AuthenticationPolicyProperties.java 的notPrevented字段private NotPreventedAuthenticationPolicyProperties notPrevented new NotPreventedAuthenticationPolicyProperties();装配逻辑位于 CoreAuthenticationUtils.java 的buildAuthenticationPolicyMap系列方法中if (policyProps.getNotPrevented().isEnabled()) { val policy new NotPreventedAuthenticationPolicy(); return CollectionUtils.wrapList(configureAuthenticationPolicy(policy, policyProps.getNotPrevented())); }可以看到只有enabledtrue时才会实例化NotPreventedAuthenticationPolicy并加入策略集合configureAuthenticationPolicy负责把name、order等元数据同步到策略对象。配置模型类标注了RequiresModule(name cas-server-core-authentication, automated true)表明该功能由核心认证模块提供开箱即用无需额外引入 support 模块。CoreAuthenticationUtilsTests中也验证了该属性开关的行为见 CoreAuthenticationUtilsTests.javasetEnabled(false)与setEnabled(true)分别对应策略的不装配与装配。四、服务级粒度Registered Service 认证策略条件除了全局配置Not Prevented还可以作为单个已注册服务Registered Service的认证策略条件使用实现按应用定制的认证要求。这通过NotPreventedRegisteredServiceAuthenticationPolicyCriteria完成实现见 NotPreventedRegisteredServiceAuthenticationPolicyCriteria.javapublic class NotPreventedRegisteredServiceAuthenticationPolicyCriteria implements RegisteredServiceAuthenticationPolicyCriteria { Override public AuthenticationPolicy toAuthenticationPolicy(final RegisteredService registeredService) { return new NotPreventedAuthenticationPolicy(); } }从源码结构看该 Criteria 直接把服务级条件转换为NotPreventedAuthenticationPolicy实例因此服务级使用与全局启用共享同一套判定逻辑。相关服务解析逻辑在 RegisteredServiceAuthenticationPolicyResolverTests.java 中有测试覆盖。在服务注册 JSON 中可以通过authenticationPolicy.criteria类名方式引用该条件具体序列化形态取决于服务注册文件的class与 criteria 类型。其可被 Jackson 反序列化并由RegisteredServiceAuthenticationPolicyResolver在服务认证时解析为实际策略。五、与相近策略的对比与选型建议在 CAS 的认证策略体系中Not Prevented与以下几个策略容易混淆理解差异有助于正确选型策略核心语义失败关闭程度AllAuthenticationHandlersSucceeded所有参与认证的 handler 都必须成功高NotPrevented不得出现PreventedException阻塞且所有 handler 均成功tryAlltrue高含系统异常关闭AtLeastOneCredentialValidated至少一个凭证通过验证即可默认tryAllfalse低从源码继承关系看NotPrevented的关键价值在于把“系统级不确定错误如后端认证存储通信失败”纳入了策略判定在多后端认证场景下如果 LDAP 短暂不可达导致PreventedException而密码本身可能完全正确此时若使用宽松的“至少一个成功”策略请求可能仍然放行而NotPrevented会果断失败避免在基础设施异常时做出错误的信任决策。适用场景建议安全敏感、要求 fail-closed 的应用如金融、政务系统——后端异常宁可拒绝也不放行多认证后端并存、需要显式控制“部分后端故障”影响的部署服务级差异化对个别高安全要求应用启用NotPrevented其他应用保持默认策略。需要留意的代价由于tryAlltrue该策略要求所有有资格处理的 handler 都成功因此对后端可用性要求更高任何单一后端故障都会导致整体认证失败业务可用性会相应降低。启用前应评估后端高可用保障。六、常见问题排查配置了not-prevented.enabled: true但策略未生效检查属性路径是否为cas.authn.policy.not-prevented注意是not-prevented连字符形式同时确认该开关对应的装配分支在 CoreAuthenticationUtils.java 中按顺序生效多个策略同时启用时会按order执行。认证日志出现Authentication policy has failed given at least one authentication failure is found to prevent authentication表示存在PreventedException应优先排查后端认证存储LDAP、JDBC 等的连通性与超时配置而不是调整策略。策略名称/顺序在审计中不清晰通过name与order属性为策略命名并排序便于多策略组合时的日志定位。小结Not Prevented是 Apereo CAS 中面向“不确定安全事件”的 fail-closed 认证策略它在“所有认证处理器均成功”的基础上额外要求认证事件中不存在PreventedException阻塞。通过 NotPreventedAuthenticationPolicy.java 的失败扫描逻辑以及cas.authn.policy.not-prevented配置与服务级 Criteria 两条装配路径你可以灵活地在全局或单服务粒度启用这一策略为高安全场景提供更严格、更可预期的认证判定。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS 认证策略之 All多凭据全量认证的配置与实现原理Apereo CAS 认证策略之 All多凭据全量认证的配置与实现原理 导读 All 认证策略Authentication Policy是 Apereo后端认证鉴权单点登录Apereo CAS 接入 Amazon Cloud Directory 认证配置、原理与排障实战Apereo CAS 接入 Amazon Cloud Directory 认证配置、原理与排障实战 导读 本文基于 Apereo CAS 官方文档 AWS C后端认证鉴权单点登录Apereo CAS 认证组件配置指南认证管理器、认证处理器与认证策略体系Apereo CAS 认证组件配置指南认证管理器、认证处理器与认证策略体系 本文围绕 Apereo CAS 认证流程的骨架——认证管理器Authentica后端认证鉴权单点登录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

在 C 语言中集成 PRQL:prqlc-c 最小示例从编译到运行全解析

在 C 语言中集成 PRQL:prqlc-c 最小示例从编译到运行全解析

后端 【免费下载链接】prql PRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement 项目地址: https://gitcode.com/gh_mirrors/pr/prql 点击查看 免费下载 本篇技术指南以 PRQL 仓库中 minimal-c 示例 为核心&#…

2026/9/24 1:52:30 阅读更多 →
STM32H7 OSPI+PSRAM内存映射实战:MPU配置与时序避坑指南

STM32H7 OSPI+PSRAM内存映射实战:MPU配置与时序避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 1:51:30 阅读更多 →
PaddleHub vgg13_imagenet 图像分类模块:基于 VGG13 与 ImageNet-2012 的安装、预测 API 与实现原理详解

PaddleHub vgg13_imagenet 图像分类模块:基于 VGG13 与 ImageNet-2012 的安装、预测 API 与实现原理详解

人工智能大模型微调模型推理服务 【免费下载链接】PaddleFormers PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers 点击查看 免费下载 导读…

2026/9/24 1:51:30 阅读更多 →

最新新闻

SSM计算机毕设之基于 SSM 的线上课程学习考评系统的设计与实现 基于 SSM 的网络化教育视频服务系统(完整前后端代码+说明文档+LW,调试定制等)

SSM计算机毕设之基于 SSM 的线上课程学习考评系统的设计与实现 基于 SSM 的网络化教育视频服务系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/24 4:05:53 阅读更多 →
【SSM课程设计/毕业设计】基于 SSM 的在线教学内容管理系统的设计与实现 基于 SSM 的教育培训视频阅览系统的设计与实现【附源码、数据库、万字文档】

【SSM课程设计/毕业设计】基于 SSM 的在线教学内容管理系统的设计与实现 基于 SSM 的教育培训视频阅览系统的设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/24 4:05:53 阅读更多 →
Prisma CLI 数据导出实战:`prisma export` 命令详解与底层实现原理

Prisma CLI 数据导出实战:`prisma export` 命令详解与底层实现原理

后端数据库GraphQL 【免费下载链接】prisma1 💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated] 项目地址: https://gitcode.com/gh_mirrors/pr/prisma1 点击查看 免费下载 本文围绕 Prisma 1.x 的 …

2026/9/24 4:05:53 阅读更多 →
电流采样电阻PCB布局:三种开尔文接法对比与0.1%精度实现

电流采样电阻PCB布局:三种开尔文接法对比与0.1%精度实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 4:05:53 阅读更多 →
【SSM毕业设计】基于 SSM 的线上教学资源共享系统的设计与实现 基于 SSM 的学生视频学习管理系统(源码+文档+远程调试,全bao定制等)

【SSM毕业设计】基于 SSM 的线上教学资源共享系统的设计与实现 基于 SSM 的学生视频学习管理系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/24 4:05:53 阅读更多 →
ESP32 上跑 WebAssembly:运行时如何把字节码翻译给 CPU

ESP32 上跑 WebAssembly:运行时如何把字节码翻译给 CPU

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 4:04:53 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →