讲师中心 微信公众号
AI工具推荐 视频效率加速

Keycloak 自定义认证流程完整实现指南

云磊吖_3496

云磊吖_3496

发布时间:2026-02-09 15:07:43

|

141人浏览过

|

来源于php中文网

原创

Keycloak 自定义认证流程完整实现指南

本文详细讲解如何在 keycloak 中实现基于自定义字段(如 fielda、fieldb、hash)的 oauth 2.0 密码模式认证流程,替代默认的 username/password 验证,并完成 authenticator 与 authenticatorfactory 的注册、部署及流程绑定。

要在 Keycloak 中实现完全自定义的认证逻辑(例如接收 fieldA、fieldB 和 hash 作为凭证,而非标准 username/password),并使其兼容标准 OIDC Token 端点(如 POST /realms/{realm}/protocol/openid-connect/token?grant_type=password),仅实现 Authenticator 接口是不够的——你必须将其封装为可插拔的 SPI(Service Provider Interface)组件,并通过 Keycloak 管理控制台启用。以下是完整、可落地的操作流程:

✅ 第一步:实现核心认证逻辑(Authenticator)

你的 CustomAuthenticator 需从请求中提取自定义参数,并完成业务校验(如签名验证、令牌解密、第三方系统鉴权等)。注意:Keycloak 默认密码流要求用户已存在且处于启用状态,因此需确保 UserModel 被正确关联。

public class CustomAuthenticator implements Authenticator {

    @Override
    public void authenticate(AuthenticationFlowContext context) {
        // 1. 从表单请求中获取自定义字段(非 username/password)
        String fieldA = context.getHttpRequest().getDecodedFormParameters().getFirst("fieldA");
        String fieldB = context.getHttpRequest().getDecodedFormParameters().getFirst("fieldB");
        String hash = context.getHttpRequest().getDecodedFormParameters().getFirst("hash");

        // 2. 执行自定义校验逻辑(示例:简单哈希比对,生产环境请使用 HMAC/签名验签)
        if (isValidCredentials(fieldA, fieldB, hash)) {
            // 3. 根据 fieldA(或其它唯一标识)查找对应用户(注意:需确保该用户已在 Keycloak 中存在)
            UserModel user = context.getSession()
                    .users()
                    .getUserByUsername(fieldA, context.getRealm()); // 或用 getUserById / searchUsersByAttribute

            if (user != null && user.isEnabled()) {
                context.setUser(user);
                context.success(); // 认证成功 → 进入后续步骤(如角色映射、token 发放)
                return;
            }
        }

        // 认证失败:返回标准错误响应
        context.failure(AuthenticationFlowError.INVALID_USER);
    }

    private boolean isValidCredentials(String fieldA, String fieldB, String hash) {
        // ✅ 替换为实际业务逻辑:如调用内部服务、验证 JWT、校验 HMAC-SHA256 签名等
        return "expected-hash".equals(hash) && fieldA != null && fieldB != null;
    }

    @Override
    public void action(AuthenticationFlowContext context) {
        // 此方法用于处理表单提交后的 POST 操作(如二次确认),纯 API 流程中通常无需实现
        authenticate(context);
    }

    @Override
    public boolean requiresUser() {
        return true; // 表明此步骤需要关联一个用户(否则 context.setUser() 无效)
    }

    @Override
    public boolean configuredFor(KeycloakSession session, RealmModel realm, UserModel user) {
        return true; // 简化处理;如需细粒度控制(如仅对某类用户启用),可在此校验
    }

    @Override
    public void setRequiredActions(KeycloakSession session, RealmModel realm, UserModel user) {
        // 可选:设置强制操作(如首次登录修改密码)
    }

    @Override
    public void close() {
        // 资源清理(如关闭连接池),若无则留空
    }
}
⚠️ 关键注意事项:authenticate() 中必须调用 context.setUser(user) + context.success(),否则 Keycloak 不会颁发 token;用户必须预先存在于 Realm 中(可通过 Admin REST API、管理控制台或用户联合方式导入),Keycloak 不支持“动态创建用户+认证”一体化(除非额外实现 UserStorageProvider);若需无用户预置的场景(如手机号+短信验证码直登),应结合 UserStorageProvider 或改用 Direct Grant 流程扩展。

✅ 第二步:提供工厂类(AuthenticatorFactory)

AuthenticatorFactory 是 Keycloak 加载你认证器的入口,负责声明元信息并返回实例:

public class CustomAuthenticatorFactory implements AuthenticatorFactory {

    public static final String PROVIDER_ID = "custom-sso";

    private static final CustomAuthenticator SINGLETON = new CustomAuthenticator();

    @Override
    public String getDisplayType() {
        return "Custom SSO Flow"; // 控制台中显示的名称
    }

    @Override
    public String getReferenceCategory() {
        return "custom-auth"; // 分组标识(可选)
    }

    @Override
    public boolean isConfigurable() {
        return false; // 如无需运行时配置,设为 false
    }

    @Override
    public AuthenticationExecutionModel.Requirement[] getRequirementChoices() {
        return new AuthenticationExecutionModel.Requirement[]{
                AuthenticationExecutionModel.Requirement.REQUIRED,
                AuthenticationExecutionModel.Requirement.DISABLED
        };
    }

    @Override
    public Authenticator create(KeycloakSession session) {
        return SINGLETON;
    }

    @Override
    public String getId() {
        return PROVIDER_ID;
    }

    @Override
    public String getHelpText() {
        return "Authenticates users via custom fieldA/fieldB/hash credentials.";
    }
}

✅ 第三步:注册 SPI 服务

在项目资源目录下创建文件:
src/main/resources/META-INF/services/org.keycloak.authentication.AuthenticatorFactory

word报告自动生成神器
word报告自动生成神器

Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。

下载

文件内容仅一行(指向你的 Factory 实现类):

com.example.auth.CustomAuthenticatorFactory

? 提示:确保构建后该文件存在于 JAR 包的 META-INF/services/ 路径下。

✅ 第四步:打包部署与流程绑定

  1. 将模块打包为 JAR(推荐使用 Maven Shade Plugin 合并依赖);
  2. 将 JAR 放入 Keycloak 的 providers/ 目录(如 $KEYCLOAK_HOME/providers/);
  3. 重启 Keycloak(或执行 bin/kc.sh build --features=preview + kc.sh start,取决于版本);
  4. 登录管理控制台 → Realm Settings → Authentication → Flows;
  5. 复制内置 Direct Grant 流程(因 Browser 流不支持密码模式,而 Direct Grant 才是 /token?grant_type=password 的实际载体);
  6. 在新流程中,点击 + Execution → 选择你的 Custom SSO Flow → 设为 REQUIRED;
  7. 返回 Authentication → Bindings,将 Direct Grant Flow 绑定到你新建的自定义流程。

✅ 最终验证(cURL 示例)

curl -X POST \
  "http://localhost:8080/realms/myrealm/protocol/openid-connect/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=myclient" \
  -d "client_secret=xxx" \
  -d "grant_type=password" \
  -d "fieldA=user123" \
  -d "fieldB=serviceX" \
  -d "hash=abc123def456"

✅ 成功时将返回标准 OIDC token 响应(含 access_token, refresh_token, expires_in)。

? 总结

  • Keycloak 自定义认证 ≠ 仅写一个 Authenticator,而是完整的 SPI 插件开发流程;
  • 必须配套 AuthenticatorFactory + META-INF/services 注册 + 控制台流程绑定;
  • Direct Grant 流程是密码模式的载体,不可修改内置 Browser 流;
  • 用户必须预先存在,认证器只负责“验证身份”,不负责“创建身份”;
  • 生产环境务必强化安全校验(防重放、签名时效、密钥轮转、审计日志)。

遵循以上步骤,即可安全、稳定地将 Keycloak 集成至任意自有认证体系,实现真正的协议兼容与业务解耦。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

4100

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

389

2026.05.09

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

3723

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

855

2023.10.30

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

14306

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1685

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

3957

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

6121

2024.03.01

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn