Shiro限制登录尝试次数(适用于单节点)
要限制用户登录尝试次数,必然要对用户名密码验证失败做记录,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限制登录尝试次数(适用于单节点)相关推荐
- springMVC结合Shiro实现登录失败次数过多锁定账户功能
本文主要记录了自己遇到了一些坑,以及需要注意的细节 主要部分源码点我 提取码:jwvx 前言 添加依赖等等其他人的教程里都有,就不浪费时间解释了: application-shiro.xml 配置文件 ...
- 解锁并设置远程登录尝试次数
SQL> alter profile default limit FAILED_LOGIN_ATTEMPTS UNLIMITED; 用户远程连接在一定时间内发现较多次数连接失败就会锁住用户 这时 ...
- php限制登陆尝试次数,Laravel登录失败次数限制的实现方法
在用户身份验证的情况下,laravel 具有内置的身份验证系统.我们可以根据要求轻松修改它.身份验证中包含的功能之一是throttling. 为什么我们需要throttling保护? 基本上,thro ...
- Hadoop 单节点 伪分布 安装手记
实验环境 CentOS 6.X Hadoop 2.6.0 JDK 1.8.0_65 目的 这篇文档的目的是帮助你快速完成单机上的Hadoop安装与使用以便你对Hadoop分布式文件系统(HDFS ...
- openshift介绍及centos7安装单节点openshift、Redhat安装openshift集群完全教程
Centos7中openshift_3.11单节点安装及配置开机自启详解 本次openshift安装使用最简单便捷的单节点安装,适用于本地开发及测试 openshift简介 OpenShift是红帽公 ...
- Hadoop单节点设置
Hadoop单节点设置 目的 先决条件 支持平台 必备软件 安装软件 下载 准备启动Hadoop集群 独立运行 伪分布式操作 组态 设置无密码SSH 执行 在单个节点上的YARN 全分布式运行 目的 ...
- 使用cephadm部署单节点ceph集群,后期可扩容(基于官方文档,靠谱,读起来舒服)
目录 ceph各种部署工具比较(来自官方文档的翻译,靠谱!) 材料准备 cephadm使用条件 服务器有外网访问能力 服务器没有外网访问能力 安装cephadm cephadm的功能 两种安装方式 基 ...
- Apache Doris 单节点(可多节点)Docker集群制作教程
集群制作Author:苏奕嘉 脚本研发Author:种益 调研测试Author:杨春东 前言 Apache Doris是当下非常火热和流行的MPP架构OLAP数据库,很多同学想自学/测试Doris的使 ...
- 博文推荐|Apache Doris 单节点 Docker 集群制作教程
前言 Apache Doris 是当下非常流行的 MPP 架构 OLAP 数据库,很多同学想自学/测试 Doris 的使用和能力,但是又苦于没有环境或者畏惧冗长的编译+搭建过程,整个过程极大的劝退了很 ...
最新文章
- Error:Execution failed for task ':app:mergeDebugResources'. Error: java.lang.RuntimeException: Som
- C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
- keepalived(9)——sorry_server
- Linux手机适配,nginx同时适配PC版和手机移动版
- Oracle 20c 新特性:XGBoost 机器学习算法和 AutoML 的支持
- lssvm回归 matlab,lssvm回归预测的程序运行不了 求高手修改指点
- 【CSS3】 线性渐变
- 网络模型一般是指 OSI 七层参考模型和 TCP/IP 五层参考模型。
- iOS 百度地图与高德地图经纬度转换(坐标转换)
- access ribbon 编程_彻底玩转MS ACCESS 2016功能区编程设计(01)
- 逐点比较直线插补和圆弧插补
- Eyoucms采集-易优实时数据采集-Eyoucms自动采集
- yolov3 darknet 中文标签 中文汉化
- 【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现)
- 不重装系统改硬盘模式: RAID ON 改成 AHCI
- 随机森林原始论文_【科普天地】2020年还需要阅读的10篇人工智能论文(附链接)...
- 不变初心数 (15 分)
- CoreOS Fest 系列之第二篇: Systemd、Go、Calico、Sysdig
- 【矩阵乘法】行为方案
- 拍卖理论 英式拍卖 和 荷兰式拍卖 是什么
热门文章
- word怎么拆分表格
- 学日语就是一种煎熬!
- 《道德经》新解(上篇)
- 什么是库尼乌斯(the Cuneus)
- 藏书阁(非技术流书籍)
- 超简单PictureSelector使用,从相册中选取多张图片并显示再列表中,微信样式,解决相册全白问题,可以拖拽删除并排序
- 2022科技公司薪酬排行榜,来了!
- 计算机科学丛书数据库系统,计算机科学丛书:数据库系统概念 读书笔记(十四)--事务(示例代码)...
- 第三方支付机构的资本:客户备付金
- 【软件网每日新闻播报│第9-22期】