欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot整合shiro登錄失敗次數(shù)限制功能的實現(xiàn)代碼

 更新時間:2018年09月03日 14:49:26   作者:這個名字想了很久  
這篇文章主要介紹了springboot整合shiro-登錄失敗次數(shù)限制功能,實現(xiàn)此功能如果是防止壞人多次嘗試,破解密碼的情況,所以要限制用戶登錄嘗試次數(shù),需要的朋友可以參考下

這次講講如何限制用戶登錄嘗試次數(shù),防止壞人多次嘗試,惡意暴力破解密碼的情況出現(xiàn),要限制用戶登錄嘗試次數(shù),必然要對用戶名密碼驗證失敗做記錄,Shiro中用戶名密碼的驗證交給了CredentialsMatcher 所以在CredentialsMatcher里面檢查,記錄登錄次數(shù)是最簡單的做法。當?shù)卿浭〈螖?shù)達到限制,修改數(shù)據(jù)庫中的狀態(tài)字段,并返回前臺錯誤信息。
 因為之前的博客都是用的明文,這里就不對密碼進行加密了,如果有需要加密,將自定義密碼比較器從SimpleCredentialsMatcher改為HashedCredentialsMatcher 然后將對應的配置項打開就可以。

說在前面

非常抱歉,因為我之前整合的時候,只是注意功能,而沒有注意細節(jié),導致在登錄失敗之后,再次轉(zhuǎn)發(fā)到 post方法/login 也就是真正的登錄方法,導致 再次登錄,然后導致下面密碼錯誤3次之后 就 鎖定 我設置的是5次.
所以將shiroConfig中的值改為shiroFilterFactoryBean.setLoginUrl("/");具體參考源代碼。

 另外 還需要將 自定義ShiroRealm 中 密碼對比注銷掉, 將密碼對比 交給 底層的 密碼比較器才可以 鎖定用戶,否則將 永遠報密碼錯誤。,具體代碼 如下:

這里寫圖片描述 

 修改登錄方法改為登錄之后,重定向到/index

這里寫圖片描述

限制登錄次數(shù)

自定義RetryLimitHashedCredentialsMatcher繼承SimpleCredentialsMatcher

package com.springboot.test.shiro.config.shiro;
import java.util.concurrent.atomic.AtomicInteger;
import com.springboot.test.shiro.modules.user.dao.UserMapper;
import com.springboot.test.shiro.modules.user.dao.entity.User;
import org.apache.log4j.Logger;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
import org.springframework.beans.factory.annotation.Autowired;
/**
 * @author: WangSaiChao
 * @date: 2018/5/25
 * @description: 登陸次數(shù)限制
 */
public class RetryLimitHashedCredentialsMatcher extends SimpleCredentialsMatcher {
 private static final Logger logger = Logger.getLogger(RetryLimitHashedCredentialsMatcher.class);
 @Autowired
 private UserMapper userMapper;
 private Cache<String, AtomicInteger> passwordRetryCache;
 public RetryLimitHashedCredentialsMatcher(CacheManager cacheManager) {
  passwordRetryCache = cacheManager.getCache("passwordRetryCache");
 }
 @Override
 public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
  //獲取用戶名
  String username = (String)token.getPrincipal();
  //獲取用戶登錄次數(shù)
  AtomicInteger retryCount = passwordRetryCache.get(username);
  if (retryCount == null) {
   //如果用戶沒有登陸過,登陸次數(shù)加1 并放入緩存
   retryCount = new AtomicInteger(0);
   passwordRetryCache.put(username, retryCount);
  }
  if (retryCount.incrementAndGet() > 5) {
   //如果用戶登陸失敗次數(shù)大于5次 拋出鎖定用戶異常 并修改數(shù)據(jù)庫字段
   User user = userMapper.findByUserName(username);
   if (user != null && "0".equals(user.getState())){
    //數(shù)據(jù)庫字段 默認為 0 就是正常狀態(tài) 所以 要改為1
    //修改數(shù)據(jù)庫的狀態(tài)字段為鎖定
    user.setState("1");
    userMapper.update(user);
   }
   logger.info("鎖定用戶" + user.getUsername());
   //拋出用戶鎖定異常
   throw new LockedAccountException();
  }
  //判斷用戶賬號和密碼是否正確
  boolean matches = super.doCredentialsMatch(token, info);
  if (matches) {
   //如果正確,從緩存中將用戶登錄計數(shù) 清除
   passwordRetryCache.remove(username);
  }
  return matches;
 }
 /**
  * 根據(jù)用戶名 解鎖用戶
  * @param username
  * @return
  */
 public void unlockAccount(String username){
  User user = userMapper.findByUserName(username);
  if (user != null){
   //修改數(shù)據(jù)庫的狀態(tài)字段為鎖定
   user.setState("0");
   userMapper.update(user);
   passwordRetryCache.remove(username);
  }
 }
}

在shiroConfig中配置該bean

/**
 * 配置密碼比較器
 * @return
 */
@Bean("credentialsMatcher")
public RetryLimitHashedCredentialsMatcher retryLimitHashedCredentialsMatcher(){
 RetryLimitHashedCredentialsMatcher retryLimitHashedCredentialsMatcher = new RetryLimitHashedCredentialsMatcher(ehCacheManager());

 //如果密碼加密,可以打開下面配置
 //加密算法的名稱
 //retryLimitHashedCredentialsMatcher.setHashAlgorithmName("MD5");
 //配置加密的次數(shù)
 //retryLimitHashedCredentialsMatcher.setHashIterations(1024);
 //是否存儲為16進制
 //retryLimitHashedCredentialsMatcher.setStoredCredentialsHexEncoded(true);

 return retryLimitHashedCredentialsMatcher;
}

在shiroRealm中配置密碼比較器

/**
 * 身份認證realm; (這個需要自己寫,賬號密碼校驗;權限等)
 * @return
 */
@Bean
public ShiroRealm shiroRealm(){
 ShiroRealm shiroRealm = new ShiroRealm();
 ......
 //配置自定義密碼比較器
 shiroRealm.setCredentialsMatcher(retryLimitHashedCredentialsMatcher());
 return shiroRealm;
}

在ehcache-shiro.xml添加緩存項

<!-- 登錄失敗次數(shù)緩存
  注意 timeToLiveSeconds 設置為300秒 也就是5分鐘
  可以根據(jù)自己的需求更改
 -->
<cache name="passwordRetryCache"
  maxEntriesLocalHeap="2000"
  eternal="false"
  timeToIdleSeconds="0"
  timeToLiveSeconds="300"
  overflowToDisk="false"
  statistics="true">
</cache>

在LoginController中添加解除admin用戶限制方法

/**
 * 解除admin 用戶的限制登錄 
 * 寫死的 方便測試
 * @return
 */
@RequestMapping("/unlockAccount")
public String unlockAccount(Model model){
 model.addAttribute("msg","用戶解鎖成功");

 retryLimitHashedCredentialsMatcher.unlockAccount("admin");

 return "login";
}

注意:為了方便測試,記得將 unlockAccount 權限改為 任何人可訪問。

在login.html頁面 添加 解鎖admin用戶的按鈕

<a href="/unlockAccount" rel="external nofollow" >解鎖admin用戶</a></button>

測試結(jié)果


這里寫圖片描述

總結(jié)

以上所述是小編給大家介紹的springboot整合shiro-登錄失敗次數(shù)限制,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • Java實現(xiàn)FTP文件上傳

    Java實現(xiàn)FTP文件上傳

    FTP 是File Transfer Protocol(文件傳輸協(xié)議)的英文簡稱,而中文簡稱為“文傳協(xié)議”。用于Internet上的控制文件的雙向傳輸。本文將講解如何用Java實現(xiàn)FTP文件上傳
    2021-05-05
  • Netty分布式Server啟動流程服務端初始化源碼分析

    Netty分布式Server啟動流程服務端初始化源碼分析

    本章主要講解server啟動的關鍵步驟,?讀者只需要了解server啟動的大概邏輯,?知道關鍵的步驟在哪個類執(zhí)行即可,?并不需要了解每一步的運作機制,?之后會對每個模塊進行深度分析
    2022-03-03
  • Spring及Mybatis整合占位符解析失敗問題解決

    Spring及Mybatis整合占位符解析失敗問題解決

    這篇文章主要介紹了Spring及Mybatis整合占位符解析失敗問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot中的FailureAnalyzer使用詳解

    SpringBoot中的FailureAnalyzer使用詳解

    這篇文章主要介紹了SpringBoot中的FailureAnalyzer使用詳解,Spring Boot的FailureAnalyzer是一個接口,它用于在Spring Boot應用啟動失敗時提供有關錯誤的詳細信息,這對于開發(fā)者來說非常有用,因為它可以幫助我們快速識別問題并找到解決方案,需要的朋友可以參考下
    2023-12-12
  • Java實現(xiàn)字符數(shù)組全排列的方法

    Java實現(xiàn)字符數(shù)組全排列的方法

    這篇文章主要介紹了Java實現(xiàn)字符數(shù)組全排列的方法,涉及Java針對字符數(shù)組的遍歷及排序算法的實現(xiàn)技巧,需要的朋友可以參考下
    2015-12-12
  • mybatis-plus數(shù)據(jù)權限實現(xiàn)代碼

    mybatis-plus數(shù)據(jù)權限實現(xiàn)代碼

    這篇文章主要介紹了mybatis-plus數(shù)據(jù)權限實現(xiàn),結(jié)合了mybatis-plus的插件方式,做出了自己的注解方式的數(shù)據(jù)權限,雖然可能存在一部分的局限性,但很好的解決了我們自己去解析SQL的功能,需要的朋友可以參考下
    2023-06-06
  • Spring @Value 設置默認值的實現(xiàn)

    Spring @Value 設置默認值的實現(xiàn)

    這篇文章主要介紹了Spring @Value 設置默認值的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Spring boot如何配置請求的入?yún)⒑统鰠son數(shù)據(jù)格式

    Spring boot如何配置請求的入?yún)⒑统鰠son數(shù)據(jù)格式

    這篇文章主要介紹了spring boot如何配置請求的入?yún)⒑统鰠son數(shù)據(jù)格式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • idea啟動與jar包啟動中使用resource資源文件路徑的問題

    idea啟動與jar包啟動中使用resource資源文件路徑的問題

    這篇文章主要介紹了idea啟動與jar包啟動中使用resource資源文件路徑的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 解決spring中redistemplate不能用通配符keys查出相應Key的問題

    解決spring中redistemplate不能用通配符keys查出相應Key的問題

    這篇文章主要介紹了解決spring中redistemplate不能用通配符keys查出相應Key的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論