在我们的Spring应用程序的登录页面上,我想在他们的帐户被锁定时(即他们输入错误的密码3次或更多次)向用户显示不同的错误消息,而不是他们的登录凭据不正确。此时,应用程序始终显示错误消息"您的登录尝试未成功,请重试。原因:凭证错误"无论凭据是否错误或帐户被锁定。
在我的messages.properties文件中,我有以下内容:
login.form.error=Your login attempt was not successful, try again. Reason: Bad credentials
login.form.locked=Your login attempts reached maximum number of trials. Please contact the administrator.
在login.jsp中我有这段代码:
<c:if test="${error}">
<h1 class="heading-medium error-summary-heading esifWebErrorSummaryHeadingColor">
<spring:message code="login.form.error" />
</h1>
</c:if>
<c:if test="${locked}">
<h1 class="heading-medium error-summary-heading esifWebErrorSummaryHeadingColor">
<spring:message code="login.form.locked" />
</h1>
</c:if>
然后在LoginController.java中我有以下代码:
public class LoginController {
@Value("${datamart.web.base.app}")
private String datamartBaseURL;
@Autowired
LandingPageHandler landingPageHandler;
@RequestMapping(value="/login", method = RequestMethod.GET)
public ModelAndView renderDocumentAsPathVariable(
@RequestParam(value="error", required=false) String error,
@RequestParam(value="locked", required=false) String locked,
HttpServletRequest request,
HttpServletResponse response
) throws IOException, ServletException
{
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && !(auth instanceof AnonymousAuthenticationToken)) {
/* The user is logged in :) */
landingPageHandler.onAuthenticationSuccess(request, response, auth);
}
ModelAndView mv = new ModelAndView("login");
mv.addObject("error", error != null);
mv.addObject("locked", locked != null);
return mv;
}
}
我已经通过故意锁定我的帐户(连续3次输入错误的密码),然后在第4次登录尝试时输入正确的密码进行了测试,但它仍显示&#34;错误的凭据&#34;错误消息而不是&#34;您的登录尝试达到最大试验次数&#34;信息。谁能告诉我这里出了什么问题?
答案 0 :(得分:0)
您想要的可能是具有最新登录尝试的内存存储库。 我使用CircularFifoQueue只保留了少量最后一次内存尝试。但是,这并不是一种安全的做法。显示不同的消息可启用枚举攻击。查看更多详情here