如何让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
相关产品推荐
相关产品推荐

