
后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载委托认证Delegate Authentication是 Apereo CAS 的一项核心能力CAS 以 pac4j 客户端身份将登录请求转发给外部身份提供商如其他 CAS 服务器、SAML2 IdP、OAuth2 / OIDC 提供商并完成协议翻译。本指南聚焦于其中定制这一环节如何修改 CAS 内置身份提供商的行为以及如何注册一个全新的外部身份提供商使 CAS 在开箱即用的 Provider 之外满足你的专属接入需求。读完本文你将掌握DelegatedClientFactoryCustomizer、DelegatedIdentityProviderFactory与ConfigurableDelegatedClientBuilder三种扩展点的用法、底层调用时机与最佳实践。委托认证定制概览委托认证的整体流程请参阅 Delegate-AuthenticationCAS 通过 pac4j 库 充当客户端服务提供方 / 代理把认证委托给外部 CAS 服务器、SAML2 IdP、OAuth2如 Facebook、Twitter、GitHub、Google、LinkedIn或 OpenID Connect如 Google、Apple等身份提供商并在中间完成协议翻译。针对身份提供商本身CAS 提供两类定制入口定制现有身份提供商修改 CAS 已内置的某个 IdP 客户端覆盖或调整其部分行为注册全新身份提供商把完全不属于 CAS 内置列表的外部 IdP 注册进运行时使其与内置 Provider 一样可被发现、配置与初始化。二者都要求你在自己的项目通常指基于 WAR overlay 或源码构建的工程中构建并注册对应的Bean。关于如何把自定义配置注册进 CAS 运行时请参考 Configuration Management Extensions 指南。定制现有身份提供商DelegatedClientFactoryCustomizer若只想调整一个已存在的身份提供商的某些行为例如覆盖回调地址、自定义属性、显示样式等需要构建并注册一个DelegatedClientFactoryCustomizer类型的BeanBean public DelegatedClientFactoryCustomizer myCustomizer() { return client - { if (client instanceof MyClient myClient) { // Customize here... } }; }接口定义与排序语义该接口定义在 DelegatedClientFactoryCustomizer.java是一个泛型函数式接口FunctionalInterface public interface DelegatedClientFactoryCustomizerT extends Client extends Ordered { Override default int getOrder() { return Ordered.LOWEST_PRECEDENCE; } void customize(T client); }三个要点值得注意泛型参数T extends Client允许你按客户端类型精确命中目标通过client instanceof MyClient模式匹配后再做针对性修改它继承自 Spring 的Ordered默认优先级为LOWEST_PRECEDENCE。当存在多个 Customizer 时可通过重写getOrder()控制执行次序它是函数式接口因此直接用 lambda 或方法引用即可构造无需显式实现类。底层调用时机从源码结构看DelegatedClientFactoryCustomizer的实例集合会被注入到多个工厂实现中包括 DefaultDelegatedIdentityProviderFactory、JdbcDelegatedIdentityProviderFactory 与 RestfulDelegatedIdentityProviderFactory。真正执行定制的方法位于 BaseDelegatedIdentityProviderFactory.javaprotected void invokeClientCustomizers(final BaseClient client) { customizers.forEach(customizer - customizer.customize(client)); }也就是说每当 CAS 构建或重建委托客户端时所有已注册的 Customizer 都会按顺序被逐一调用你可以在此时安全地改写客户端的回调 URL、自定义属性、logout 行为等。需要注意的是Customizer 的生效时机是客户端构建之后它适合做行为层面的微调而不是替换客户端本身。注册全新的身份提供商DelegatedIdentityProviderFactory如果你需要让 CAS 支持一个完全自定义的外部 IdP则需构建并注册一个DelegatedIdentityProviderFactory类型的BeanBean public DelegatedIdentityProviderFactory pac4jDelegatedClientFactory() { return new MyDelegatedIdentityProviderFactory(); }工厂接口的职责DelegatedIdentityProviderFactory定义于 DelegatedIdentityProviderFactory.java负责重新构建委托身份提供商实例接口方法包括ListBaseClient build()构建当前配置的客户端集合void store(String key, ListBaseClient currentClients)按 key 缓存客户端ListBaseClient retrieve(String key)按 key 取回客户端ListBaseClient rebuild()重建整个集合并使缓存失效ListBaseClient buildFrom(CasConfigurationProperties properties)基于 CAS 配置属性构建客户端这是大多数实现的核心入口同时实现DisposableBean在容器销毁时释放资源。此外接口内提供了一系列静态工具方法帮助你标准化地完成客户端装配后面会详细展开静态方法作用configureClientName(client, clientName)设置客户端名称名称为空时自动生成类名4位随机数并输出告警日志configureClientCustomProperties(client, clientProperties)将 autoRedirectType、principalIdAttribute、cssClass、displayName 等写入客户端 custom propertiesconfigureClientCallbackUrl(client, clientProperties, defaultUrl)为间接客户端IndirectClient设置回调 URL并按callbackUrlType选择PathParameterCallbackUrlResolver、QueryParameterCallbackUrlResolver或NoParameterCallbackUrlResolverconfigureLogoutPropagation(client, clientProperties)当propagateLogout为 false 时清空间接客户端的 logout 动作阻止注销向外部 IdP 传播自定义工厂实现可以参考 CAS 内置的DefaultDelegatedIdentityProviderFactory等实现它们在构建流程中都会注入并使用DelegatedClientFactoryCustomizer集合对最终客户端做后处理。内置注册选项多数场景下你并不需要从零实现工厂。CAS 已提供多种现成的 IdP 注册方式配置文件、JDBC、REST 等请参阅 Delegate Authentication Provider Registration 指南了解全部内置选项。同样地将自定义配置注册进 CAS 运行时的方法参见 Configuration Management Extensions。更简单的方案ConfigurableDelegatedClientBuilder如果你不想实现整套工厂可以走一条更轻的路径复用 CAS 内置的DelegatedIdentityProviderFactory只负责供应身份提供商实例其余装配与初始化交给工厂完成。此时只需构建并注册ConfigurableDelegatedClientBuilder类型的BeanBean public ConfigurableDelegatedClientBuilder myClientBuilder() { return new MyDelegatedClientBuilder(); }你可以按需定义任意多个ConfigurableDelegatedClientBuilder实例DelegatedIdentityProviderFactory会自动拾取这些新的身份提供商实例完成配置与初始化使其可被 CAS 使用。接口契约ConfigurableDelegatedClientBuilder定义于 ConfigurableDelegatedClientBuilder.java同样是一个函数式接口并继承了NamedObject因此每个 builder 都带有可识别的名称用于日志输出与排序识别FunctionalInterface public interface ConfigurableDelegatedClientBuilder extends NamedObject { ListConfigurableDelegatedClient build(CasConfigurationProperties casProperties) throws Exception; default List? extends BaseClient configure(final BaseClient client, final Pac4jBaseClientProperties clientProperties, final CasConfigurationProperties properties) throws Exception { return List.of(client); } }从源码结构看build(CasConfigurationProperties)返回的每个ConfigurableDelegatedClient实例都携带着客户端对象 对应的Pac4jBaseClientProperties属性供工厂统一装配。可选的configure(client, clientProperties, properties)默认原样返回客户端允许你在工厂装配完成后再做一步定制。自动发现与装配流程DelegatedIdentityProviderFactory之所以能自动拾取你的 builder是因为底层实现通过 Spring 容器按类型查找所有 builder。核心逻辑位于 BaseDelegatedIdentityProviderFactory.javapublic ListBaseClient buildFrom(final CasConfigurationProperties properties) throws Exception { val newClients new LinkedHashSetBaseClient(); val builders getDelegatedClientBuilders(); for (val builder : builders) { val builtClients builder.build(properties); LOGGER.debug(Builder [{}] provides [{}] clients, builder.getName(), builtClients.size()); builtClients.forEach(Unchecked.consumer(instance - { val preparedClient configureClient(instance.getClient(), instance.getProperties(), properties); val configuredClients builder.configure(preparedClient, instance.getProperties(), properties); configuredClients .stream() .filter(configured - configured.equals(preparedClient)) .forEach(this::invokeClientCustomizers); newClients.addAll(configuredClients); })); } return List.copyOf(newClients); } private ListConfigurableDelegatedClientBuilder getDelegatedClientBuilders() { val builders new ArrayList(applicationContext.getBeansOfType(ConfigurableDelegatedClientBuilder.class).values()); AnnotationAwareOrderComparator.sort(builders); return builders; }整个流程可以拆解为五个步骤收集applicationContext.getBeansOfType(ConfigurableDelegatedClientBuilder.class)从 Spring 容器中找出所有ConfigurableDelegatedClientBuilderbean排序通过AnnotationAwareOrderComparator.sort(builders)按Order/Ordered语义排序保证多个 builder 的执行次序可控构建逐个调用builder.build(properties)获得原始客户端实例装配对每个实例先执行configureClient(...)将名称、回调 URL、自定义属性、logout 行为等按Pac4jBaseClientProperties统一配置再交给builder.configure(...)做扩展若cas.authn.pac4j.core.lazyInit未开启还会对客户端执行client.init()完成初始化定制对未被 builder 替换的最终客户端调用invokeClientCustomizers(...)把上文的DelegatedClientFactoryCustomizer一并应用。因此ConfigurableDelegatedClientBuilder与DelegatedClientFactoryCustomizer是互补的两层扩展点builder 负责造出客户端customizer 负责在工厂装配后精修客户端二者在buildFrom流程中先后生效。常见的定制切入点结合DelegatedIdentityProviderFactory提供的静态工具方法以及底层Pac4jBaseClientProperties支持的字段你可以在 Customizer 或 Builder 中重点定制以下行为显示名称与样式通过 custom properties 中的displayName、cssClass控制登录页上该 IdP 按钮的文案与样式自动重定向autoRedirectType控制是否/何时自动跳转到该 IdP适用于单 IdP 场景的免点击直达主属性标识principalIdAttribute指定从 IdP 返回的 profile 中选取哪个属性作为 CAS 主体标识回调 URL 与类型callbackUrl显式覆盖默认回调地址callbackUrlType决定回调参数以路径参数PATH_PARAMETER、查询参数QUERY_PARAMETER还是无参数NONE方式传递注销传播propagateLogout为 false 时CAS 注销将不再向该外部 IdP 传播。对需要按类型精确处理的场景优先在 Customizer 中使用client instanceof模式匹配对需要携带配置属性一起构建的场景优先使用 Builder。小结Apereo CAS 的委托认证定制提供了清晰的层次化扩展模型扩展点适用场景注册方式DelegatedClientFactoryCustomizer微调现有 IdP 客户端行为Bean lambdaDelegatedIdentityProviderFactory从零实现整套 IdP 构建逻辑Bean 自定义实现类ConfigurableDelegatedClientBuilder复用内置工厂仅供应客户端实例Bean 自定义实现类可多个三者均通过 Spring 容器自动发现与装配并统一在 BaseDelegatedIdentityProviderFactory 的buildFrom流程中按序执行。实践中的通用建议是优先复用 Provider Registration 的内置选项仅在行为需要差异化时引入 Customizer只有内置选项无法表达需求时才考虑自定义 Builder 乃至完整 Factory并通过 Configuration Management Extensions 将配置注册进 CAS 运行时。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS SAML2 委托认证使用 Metadata Aggregate 一次注册多个身份提供商Apereo CAS SAML2 委托认证使用 Metadata Aggregate 一次注册多个身份提供商 本文将介绍 Apereo CAS 中通过 Met后端认证鉴权单点登录Apereo CAS 委托认证Delegated Authentication策略配置指南服务级外部身份提供商授权与选择Apereo CAS 委托认证Delegated Authentication策略配置指南服务级外部身份提供商授权与选择 CAS 允许通过服务注册中心S后端认证鉴权单点登录Apereo CAS 委托认证之 OAuth2.0通过 Pac4j 集成外部 OAuth2 身份提供方实战指南Apereo CAS 委托认证之 OAuth2.0通过 Pac4j 集成外部 OAuth2 身份提供方实战指南 本文是 Apereo CAS 委托认证Del后端认证鉴权单点登录上一篇《生命周历》开源项目教程下一篇Power Apps 示例项目安装与配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考