[英]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.