要限制用户登录尝试次数,必然要对用户名密码验证失败做记录,Shiro中用户名密码的验证交给了CredentialsMatcher 
所以在CredentialsMatcher里面检查,记录登录次数是最简单的做法。

我们用Ehcache来记录用户登录次数的计数,继承HashedCredentialsMatcher,加入缓存,在每次验证用户名密码之前先验证用户名尝试次数,如果超过5次就抛出尝试过多异常,否则验证用户名密码,验证成功把尝试次数清零,不成功则直接退出。

package org.jstudioframework.freeway.shiro.authc.credential;import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.ExcessiveAttemptsException;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.concurrent.atomic.AtomicInteger;/*** 验证器,增加了登录次数校验功能*/
public class RetryLimitCredentialsMatcher extends HashedCredentialsMatcher {private static final Logger log = LoggerFactory.getLogger(RetryLimitCredentialsMatcher.class);//集群中可能会导致出现验证多过5次的现象,因为AtomicInteger只能保证单节点并发private Cache<String, AtomicInteger> loginRetryCache;private int maxRetryCount = 5;private String loginRetryCacheName;public void setMaxRetryCount(int maxRetryCount) {this.maxRetryCount = maxRetryCount;}public RetryLimitCredentialsMatcher(CacheManager cacheManager,String loginRetryCacheName) {this.loginRetryCacheName = loginRetryCacheName;loginRetryCache = cacheManager.getCache(loginRetryCacheName);}@Overridepublic boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {String username = (String) token.getPrincipal();//retry count + 1AtomicInteger retryCount = loginRetryCache.get(username);if (null == retryCount) {retryCount = new AtomicInteger(0);loginRetryCache.put(username, retryCount);}if (retryCount.incrementAndGet() > 5) {log.warn("username: " + username + " tried to login more than 5 times in period");throw new ExcessiveAttemptsException("username: " + username + " tried to login more than 5 times in period");}boolean matches = super.doCredentialsMatch(token, info);if (matches) {//clear retry dataloginRetryCache.remove(username);}return matches;}
}

UserRealm继承AuthorizingRealm,在其父类AuthenticatingRealm的getAuthenticationInfo方法中会调用credentialsMatcher的 doCredentialsMatch 来验证用户输入用户名密码是否匹配。

Ehcache配置

    <!-- 登录记录缓存 锁定10分钟 --><cache name="loginRetryCache"maxEntriesLocalHeap="2000"eternal="false"timeToIdleSeconds="600"timeToLiveSeconds="0"overflowToDisk="false"statistics="true"></cache>

Spring Shiro配置

<!-- Realm实现 -->
<bean id="userRealm" class="org.jstudioframework.freeway.shiro.UserRealm"><!-- 将凭证匹配器设置到realm中,realm按照凭证匹配器的要求进行散列 --><property name="credentialsMatcher" ref="credentialsMatcher"/>
</bean><!-- 凭证匹配器 -->
<bean id="credentialsMatcher"class="org.jstudioframework.freeway.shiro.authc.credential.RetryLimitCredentialsMatcher"><constructor-arg index="0" ref="cacheManager"/><constructor-arg index="1" value="5"/><property name="hashAlgorithmName" value="md5"/><property name="hashIterations" value="1"/>
</bean><!-- 缓存管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"><property name="cacheManagerConfigFile" value="classpath:cache/shiro-ehcache.xml"/>
</bean>

Shiro限制登录尝试次数(适用于单节点)相关推荐

  1. springMVC结合Shiro实现登录失败次数过多锁定账户功能

    本文主要记录了自己遇到了一些坑,以及需要注意的细节 主要部分源码点我 提取码:jwvx 前言 添加依赖等等其他人的教程里都有,就不浪费时间解释了: application-shiro.xml 配置文件 ...

  2. 解锁并设置远程登录尝试次数

    SQL> alter profile default limit FAILED_LOGIN_ATTEMPTS UNLIMITED; 用户远程连接在一定时间内发现较多次数连接失败就会锁住用户 这时 ...

  3. php限制登陆尝试次数,Laravel登录失败次数限制的实现方法

    在用户身份验证的情况下,laravel 具有内置的身份验证系统.我们可以根据要求轻松修改它.身份验证中包含的功能之一是throttling. 为什么我们需要throttling保护? 基本上,thro ...

  4. Hadoop 单节点 伪分布 安装手记

    实验环境 CentOS 6.X Hadoop 2.6.0 JDK    1.8.0_65 目的 这篇文档的目的是帮助你快速完成单机上的Hadoop安装与使用以便你对Hadoop分布式文件系统(HDFS ...

  5. openshift介绍及centos7安装单节点openshift、Redhat安装openshift集群完全教程

    Centos7中openshift_3.11单节点安装及配置开机自启详解 本次openshift安装使用最简单便捷的单节点安装,适用于本地开发及测试 openshift简介 OpenShift是红帽公 ...

  6. Hadoop单节点设置

    Hadoop单节点设置 目的 先决条件 支持平台 必备软件 安装软件 下载 准备启动Hadoop集群 独立运行 伪分布式操作 组态 设置无密码SSH 执行 在单个节点上的YARN 全分布式运行 目的 ...

  7. 使用cephadm部署单节点ceph集群,后期可扩容(基于官方文档,靠谱,读起来舒服)

    目录 ceph各种部署工具比较(来自官方文档的翻译,靠谱!) 材料准备 cephadm使用条件 服务器有外网访问能力 服务器没有外网访问能力 安装cephadm cephadm的功能 两种安装方式 基 ...

  8. Apache Doris 单节点(可多节点)Docker集群制作教程

    集群制作Author:苏奕嘉 脚本研发Author:种益 调研测试Author:杨春东 前言 Apache Doris是当下非常火热和流行的MPP架构OLAP数据库,很多同学想自学/测试Doris的使 ...

  9. 博文推荐|Apache Doris 单节点 Docker 集群制作教程

    前言 Apache Doris 是当下非常流行的 MPP 架构 OLAP 数据库,很多同学想自学/测试 Doris 的使用和能力,但是又苦于没有环境或者畏惧冗长的编译+搭建过程,整个过程极大的劝退了很 ...

最新文章

  1. Error:Execution failed for task ':app:mergeDebugResources'. Error: java.lang.RuntimeException: Som
  2. C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
  3. keepalived(9)——sorry_server
  4. Linux手机适配,nginx同时适配PC版和手机移动版
  5. Oracle 20c 新特性:XGBoost 机器学习算法和 AutoML 的支持
  6. lssvm回归 matlab,lssvm回归预测的程序运行不了 求高手修改指点
  7. 【CSS3】 线性渐变
  8. 网络模型一般是指 OSI 七层参考模型和 TCP/IP 五层参考模型。
  9. iOS 百度地图与高德地图经纬度转换(坐标转换)
  10. access ribbon 编程_彻底玩转MS ACCESS 2016功能区编程设计(01)
  11. 逐点比较直线插补和圆弧插补
  12. Eyoucms采集-易优实时数据采集-Eyoucms自动采集
  13. yolov3 darknet 中文标签 中文汉化
  14. 【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现)
  15. 不重装系统改硬盘模式: RAID ON 改成 AHCI
  16. 随机森林原始论文_【科普天地】2020年还需要阅读的10篇人工智能论文(附链接)...
  17. 不变初心数 (15 分)
  18. CoreOS Fest 系列之第二篇: Systemd、Go、Calico、Sysdig
  19. 【矩阵乘法】行为方案
  20. 拍卖理论 英式拍卖 和 荷兰式拍卖 是什么

热门文章

  1. word怎么拆分表格
  2. 学日语就是一种煎熬!
  3. 《道德经》新解(上篇)
  4. 什么是库尼乌斯(the Cuneus)
  5. 藏书阁(非技术流书籍)
  6. 超简单PictureSelector使用,从相册中选取多张图片并显示再列表中,微信样式,解决相册全白问题,可以拖拽删除并排序
  7. 2022科技公司薪酬排行榜,来了!
  8. 计算机科学丛书数据库系统,计算机科学丛书:数据库系统概念 读书笔记(十四)--事务(示例代码)...
  9. 第三方支付机构的资本:客户备付金
  10. 【软件网每日新闻播报│第9-22期】