根据用户的帐户是否被锁定或他们输入了错误的凭据,显示不同的错误消息

时间:2018-03-05 13:01:48

标签: java spring

在我们的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;信息。谁能告诉我这里出了什么问题?

1 个答案:

答案 0 :(得分:0)

您想要的可能是具有最新登录尝试的内存存储库。  我使用CircularFifoQueue只保留了少量最后一次内存尝试。但是,这并不是一种安全的做法。显示不同的消息可启用枚举攻击。查看更多详情here