簡體   English   中英

JSF X 次登錄嘗試失敗后用戶鎖定

[英]JSF user lockout after X failed login attempts

對於我的 JSF 2.3 應用程序,我使用表單登錄來驗證用戶(針對 LDAP)。 容器是 Liberty 服務器。

這一切都很好。

但是,我正在嘗試在 3 次登錄嘗試失敗后實施用戶鎖定,但我不確定該怎么做。

我的應用程序使用 j_security_check 並且我有login.xhtml作為:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:myapp="http://java.sun.com/jsf/composite/myapp">

<ui:composition template="/WEB-INF/myapp-sidebar.xhtml">
    <ui:param name="title" value="#{uir['login.title']}" />
    <ui:define name="sidebar">
        <form action="j_security_check" method="post">
            <!-- user name -->
            <div class="form-group">
                <h:outputLabel for="userName" value="#{uir['userName.label']}" />
                <h:inputText autofocus="autofocus"
                    cols="#{uir['userName.input.length']}" id="j_username"
                    maxlength="#{uir['userName.input.length']}" name="j_username"
                    styleClass="form-control input-sm">
                    <f:attribute name="autocomplete" value="off" />
                </h:inputText>
            </div>
            <!-- password -->
            <div class="form-group">
                <h:outputLabel for="password" value="#{uir['password.label']}" />
                <h:inputSecret cols="#{uir['password.input.length']}"
                    id="j_password" maxlength="#{uir['password.input.length']}"
                    name="j_password" styleClass="form-control input-sm">
                    <f:attribute name="autocomplete" value="off" />
                </h:inputSecret>
            </div>

            <div class="btn-group-vertical btn-group-sm btn-block">
                <input class="btn  btn-primary btn-active" type="submit"
                    value="#{uir['login.label']}" />
            </div>
        </form>
    
        <script type="text/javascript">
            window.onload = function() {
                document.getElementById('j_username').focus();
            }
        </script>
    </ui:define>

</ui:composition>
</html>

web.xml中,我有

    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>file</realm-name>
        <form-login-config>
            <form-login-page>/login.xhtml</form-login-page>
            <form-error-page>/errorlogin.xhtml</form-error-page>
        </form-login-config>
    </login-config>

,我的errorlogin.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="/WEB-INF/myapp.xhtml">
    <ui:param name="title" value="#{uir['error.title']}" />
    <ui:define name="content">
        <h1>Login Error</h1>
        <h2>Invalid user name or password</h2>
        <p></p>
        <h:link outcome="login">Return to login page</h:link>
    </ui:define>
</ui:composition>
</html>

我當前的實現是正確處理登錄和注銷以及登錄錯誤。 如果用戶嘗試登錄並提供了錯誤的憑據,將顯示errorlogin.xhtml頁面。

但是,我試圖在用戶連續 3 次登錄失敗后實施用戶鎖定。 用戶應在 X 分鍾后解鎖,以允許他們再次嘗試登錄。

我怎么做?

我通過使用 LoadingCache 實現服務解決了這個問題

private LoadingCache<String, Integer> attemptsCache;

這將是一個過期緩存 (expireAfterWrite())。

成功登錄后,緩存將失效

登錄失敗時,緩存將更新其 integer

在 isLockedout 上,緩存將檢查整數 integer 並根據其結果返回 true 或 false

然后我提供了一個過濾器,它將檢查用戶是否在其 doFilter() 方法中被鎖定,並根據結果調用緩存 onSuccessful 或 onFailedLogin

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM