You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Keycloak 20.0.1在用户因登录失败过多被封禁时发送邮件?

Keycloak用户多次登录失败被封禁时发送邮件的实现方案

需求说明

需要在用户因多次登录触发暴力检测规则被临时封禁时,自动向用户发送通知邮件。对应的事件属性为:

  • 错误标识(org.keycloak.events.Event#getError):user_temporarily_disabled
  • 事件类型(org.keycloak.events.Event#getType):LOGIN_ERROR

已知实现方式

目前有两种可行的实现思路,均需要通过自定义事件监听器完成:

  • 方案1:调用外部邮件服务
    编写实现org.keycloak.events.EventListenerProvider接口的类,在onEvent方法中检测上述目标事件,然后向自定义的邮件服务服务器发送请求,由该服务负责连接SMTP服务器完成邮件发送。

  • 方案2:复用Keycloak内置SMTP配置
    同样基于自定义事件监听器,在onEvent方法中检测目标事件后,直接利用Keycloak后台已配置的SMTP参数(路径:领域设置 -> 邮件 -> 连接与认证)来发送邮件,无需依赖外部服务。

澄清误解

曾有截图让我误以为Keycloak支持开箱即用的事件触发邮件功能,无需编写自定义监听器,但实际验证后发现该功能并不存在,必须通过自定义开发实现。

可用代码示例

以下是方案2的可运行代码片段,可直接集成到自定义监听器的onEvent方法中:

RealmModel realm = this.model.getRealm(event.getRealmId());
UserModel user = this.session.users().getUserById(event.getUserId(), realm);
if (user != null && user.getEmail() != null) {
    System.out.println(">>>>>>>>>>>>>>>>>>>>>>" + user.getEmail());

    org.keycloak.email.DefaultEmailSenderProvider senderProvider = new org.keycloak.email.DefaultEmailSenderProvider(session);
    try {
        senderProvider.send(session.getContext().getRealm().getSmtpConfig(), user, "账号临时封禁通知", "您的账号因多次登录失败被临时封禁,请稍后重试",
                "<html><body><h3>账号临时封禁通知</h3><p>您的账号因多次登录失败被临时封禁,请稍后重试</p></body></html>");
    } catch (EmailException e) {
        e.printStackTrace();    
    }
}

内容的提问来源于stack exchange,提问作者PDP11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:25:46