Spring Security在身份验证和授权过程中为我们完成了许多工作。暴力破解是Web应用程序上的常见攻击,恶意用户会尝试将密码猜测作为暴力破解。Spring安全性是一个灵活的框架,并提供扩展点来扩展或使用核心功能。Spring Security不提供任何现成的功能来进行暴力保护,但提供了一些我们可以使用的扩展点。
在本文中,我们将构建Spring Security暴力保护以处理暴力攻击。有多种处理这些攻击的选项。
- 某些失败的尝试后锁定帐户。
- 设备Cookie –锁定未知设备。
- 使用验证码可以防止自动攻击。
本文是Spring Security初学者课程的一部分,您可以从GitHub存储库中下载源代码。
1. Spring安全认证事件
我们将使用Spring安全事件发布功能来构建我们的暴力保护服务。对于成功或失败的每个身份验证,Spring安全性都会发布AuthenticationSuccessEvent或AuthenticationFailureEvent。我们将使用此功能来构建Spring安全性的暴力保护。这是我们策略的高级工作流程。
- 我们将编写一个自定义身份验证失败事件侦听器。该侦听器将与基础服务一起使用,以保持尝试失败次数的迷航,并在超过该次数时将其锁定。
- 成功的身份验证侦听器可以重置任何失败的计数(我们会将失败的计数器重置为零)。
package com.javadevjournal.core.security.event; |
在此事件侦听器中,监听AuthenticationFailureBadCredentialsEvent,BruteForceProtectionService会将用户ID信息传递给我们,该信息将检查并在需要时禁用用户帐户。
与失败事件处理程序类似,Spring安全性还将在成功身份验证时发布事件,我们将创建一个自定义成功处理程序。该处理程序会将控件移交给BruteForceProtectionService,以重置失败的计数器。
@Component |
BruteForceProtectionService是Spring的安全蛮力保护的一部分,会执行以下任务:
- 对于每次失败的登录尝试,增加失败的计数器。
- 检查失败计数是否超过允许的最大配置。
- 如果计数器失败超过最大限制,则禁用该帐户。
- BruteForceProtectionService还将在成功登录后重置计数器。
@Service("bruteForceProtectionService") |
确保我们能够保存和更新计数以及禁用帐户,通过UserEntity和UserDetailsService实现。
@Entity |
请记住,一旦禁用帐户,即使使用成功凭据进行的登录尝试也不会解锁该帐户。要求用户使用重置密码功能来解锁帐户。
在登录页面上显示错误
上面的配置可以确保在两次弹簧登录失败尝试后帐户都被锁定,这可能是由于Spring Security蛮力保护。我们还可能希望在我们的登录页面上显示自定义错误消息,让我们对自定义登录页面及其控制器进行一些更改将以下条目添加到messages.properties文件:
user.account.locked = Your account has been locked due to multiple failed login attempts. |
一旦用户超过失败的登录尝试,我们将在登录页面上显示以上消息。下一步是对登录页面控制器进行一些更改。
@Controller |
在登录控制器中做了一些重要的事情。
- 如果正在不同地处理登录错误请求参数。获取此参数后,我们检查是否锁定了用户帐户。
- 如果它锁定了用户帐户,我们会向客户显示不同的错误消息。
- 如果您查看getUserName()方法,我们将从会话中获取用户名。
我们只将用户名存储在会话中,并让默认的身份验证处理程序AuthenticationFailureHandler在身份验证失败时执行其工作:
import org.springframework.security.core.AuthenticationException; |
在登录HTML中添加条件,以在前端显示自定义错误消息。我们在登录页面添加了以下条件。
<div th:if="${param.error!=null and accountLocked ==true}"> |