邮件相关
然后如果要发送邮件验证code来激活账户。是不是需要手动配置一个 邮件收发服务器?
下面按你两个目标分别给出 Keycloak 26(你现在的版本)里最直接、最稳妥的做法,并补充“是否必须自建邮件服务器”的工程选项。
(1)关闭重复邮箱
当前一个邮件可以注册多次,改成一个邮件只能注册一次,该怎么修改。
进入:Realm: Ordinis → Realm settings → Login
在这一页通常有几项开关(不同 UI 小版本位置可能略有差异,但都在 Login/Registration 相关区域):
-
User registration:开启/关闭注册(你既然允许注册,这个应为 ON)

-
Duplicate emails / Duplicate emails allowed:把它设为 OFF
-
(可选但强烈建议)Email as username / Registration email as username
- 让用户名直接等于 email,避免用户填一堆随机用户名导致混乱
-
(可选)Login with email:ON(允许用邮箱登录,体验更符合 SaaS)

注意:如果你当前已经有“重复邮箱的用户”存在,关闭 duplicate emails 可能会提示冲突或后续创建/更新时报错。需要先把重复邮箱的旧用户清理/合并/改邮箱。
用“配置即代码”的方式确认(你导出的 realm JSON 里)
你导出的 Ordinis-realm.json 里通常会有类似字段(不同版本字段名可能略有差异):
duplicateEmailsAllowed: falseregistrationEmailAsUsername: trueloginWithEmailAllowed: true
你可以把这些写进你的 realm 配置并通过 import 保持一致性。
2) “发送邮件验证码激活账户”:Keycloak 支持,但默认是“邮件链接”不是“数字验证码”
2.1 Keycloak 原生能力:Email Verification(发验证邮件)
路径:Realm settings → Login
把 Verify email(或 Email verification)设为 ON。
效果:
- 用户注册后,Keycloak 会发一封“验证邮箱”的邮件
- 用户点击邮件中的链接完成激活(本质是一个 action token 链接)
这是最省事、最稳定、最符合 Keycloak 设计的激活方式。
2.2 你问的“发送邮件验证 code(数字码)”
Keycloak 默认并不是给一个 6 位数 code,让用户手动输入;默认是点击链接验证。
如果你必须要“数字码 + 输入框”这种体验,一般有两种路:
- 自定义认证/Required Action(SPI 扩展):实现“生成 code、存储、发送、校验”的完整逻辑(工程量明显更大)
- 引入第三方/自建服务:让你自己的服务发码并校验,然后再回到 Keycloak(通常会破坏 Keycloak 的统一流程,不是首选)
结论:MVP 阶段我建议先用 Keycloak 原生“邮件链接验证”,后续如果产品强需求再做“数字验证码”定制。