http://www.baeldung.com/registration-verify-user-by-email
作者:Eugen Paraschiv
译者:oopsguy.com
本文续之前的 Spring Security 系列之注册流程中缺失的部分 — 验证用户的电子邮件以确认帐户。
注册确认机制强制用户在成功注册后执行确认注册电子邮件中的操作,以验证其电子邮件地址并激活帐户。用户通过单击电子邮件中的唯一激活链接来完成激活操作。
根据此逻辑,新注册的用户无法登录到系统,除非完成了该流程。
我们将使用一个简单的验证令牌作为验证用户的凭据。
2.1、VerificationToken 实体
VerificationToken 实体必须符合以下标准:
它必须指向 User(通过一个单向关系)
它将在注册后立即创建
它将在创建后 24 小时内过期
有一个唯一、随机生成的值
第 2 和 3 点是注册逻辑的一部分。其余的两个实现位于简单的 VerificationToken 实体中,如示例 2.1。
示例 2.1
注意 User 上的 nullable = false,确保了 VerificationToken <-> User 关联中数据的完整性和一致性。
2.2、将 enabled 字段添加到 User 中
当用户注册时,此 enabled 字段将被设置为 false。在帐户验证过程中,如果通过,则置为 true。
添加字段到 User 实体中:
请注意,我们也将该字段的默认值设置为 false。
让我们添加两个额外的业务逻辑到用户注册用例中:
为 User 生成 VerificationToken 并保存
发送电子邮件进行帐户确认 — 其中包含带有 VerificationToken 值的确认链接
3.1、使用 Spring Event 创建令牌并发送验证邮件
这两个额外的逻辑不应该由控制器直接执行,因为它们是并行的后台任务。
控制器将发布一个 Spring ApplicationEvent 来触发这些任务的执行。这和注入 ApplicationEventPublisher 使用它来发布注册一样简单。
示例 3.1 展示了这个简单的逻辑:
示例 3.1
另外需要注意的是包围事件发布的 try catch 块。这段代码代表了只要在发布事件后执行的逻辑中存在异常就展示一个错误页面。此处的逻辑就是发送电子邮件。
3.2、Event 与 Listener
现在让我们看看控制器发出的这个新的 OnRegistrationCompleteEvent 的实际实现,以及要处理它的监听器:
例 3.2.1 — OnRegistrationCompleteEvent
例 3.2.2 — RegistrationListener 处理 OnRegistrationCompleteEvent
在此处,confirmRegistration 方法将接收 OnRegistrationCompleteEvent,从中提取所有必要的 User 信息,创建验证令牌,将其保存,然后在确认注册链接中将其作为参数发送。
如上所述,JavaMailSender 引发的任何 javax.mail.AuthenticationFailedException 都将由控制器处理。
3.3、处理验证令牌参数
当用户收到确认注册链接时点击它。
一旦点击,控制器将提取 GET 请求中的令牌参数的值,并将使用它来启用 User。
我们来示例 3.3.1 中的这个流程:
例 3.3.1 — RegistrationController 处理注册确认
如果出现以下情况,用户将被重定向到错误页面并显示相应的信息:
由于某种原因 VerificationToken 不存在
VerificationToken 已过期
见示例 3.3.2 的错误页面。
例 3.3.2 — badUser.html
如果没有发现错误,则启用用户。
在处理 VerificationToken 检查和过期流程中有两个地方可以改进:
我们可以使用 Cron 作业在后台检查令牌是否过期
一旦过期,我们可以让用户有机会获得新的令牌
我们将生成新令牌流程推迟到后面的文章再讲,现在假设用户确实在这里成功验证了令牌。
我们需要添加检查用户是否启用的代码:
我们来看示例 4.1。其展示了 MyUserDetailsService 的 loadUserByUsername方法。
例 4.1
正如我们所看到的,现在 MyUserDetailsService 不使用 User 的 enabled 标志。
现在,我们将添加一个 AuthenticationFailureHandler 来自定义来自 MyUserDetailsService 的异常消息。我们的 CustomAuthenticationFailureHandler 如示例 4.2 所示:
例 4.2 — CustomAuthenticationFailureHandler:
我们需要修改 login.html 以显示错误消息。
示例 4.3 — 在 login.html 处显示错误消息:
现在让我们来看看一些涉及到验证令牌和用户操作的实际实现。
将涵盖以下内容:
一个新的 VerificationTokenRepository
IUserInterface 中的新方法及其对新 CRUD 操作的实现需求
示例 5.1 — 5.3 展示新的接口和实现:
示例 5.1 — VerificationTokenRepository
示例5.2 — IUserService 接口
示例 5.3 — UserService
在本文中,我们已经介绍了注册流程,包括一个基于电子邮件的帐户激活流程。
帐户激活逻辑需要通过电子邮件向用户发送验证令牌,以便他们可以将信息发送回控制器以验证身份。
这个注册与 Spring Security 教程的实现可以在 GitHub 项目中找到 — 这是一个基于 Eclipse 的项目,因此应该很容易导入运行。
https://github.com/eugenp/spring-security-registration
上一篇:现在买车都论斤了,4S店直接标价33元一斤网友:给我来一斤车头肉 |
下一篇:直投简历给HR,像这样发邮件,很容易石沉大海! |