Shiro security限制登录尝试次数

之前讲了Shiro Security如何结合验证码,这次讲讲如何限制用户登录尝试次数,防止多次尝试,暴力破解密码情况出现。要限制用户登录尝试次数,必然要对用户名密码验证失败做记录,Shiro中用户名密码的验证交给了CredentialsMatcher

所以在CredentialsMatcher里面检查,记录登录次数是最简单的做法。Shiro天生和Ehcache是一对好搭档,无论是单机还是集群,都可以在Ehcache中存储登录尝试次数信息。

现在介绍一个简单的登录次数验证做法,实现一个RetryLimitCredentialsMatchers继承至HashedCredentialsMatcher,加入缓存,在每次验证用户名密码之前先验证用户名尝试次数,如果超过5次就抛出尝试过多异常,否则验证用户名密码,验证成功把尝试次数清零,不成功则直接退出。这里依靠Ehcache自带的timeToIdleSeconds来保证锁定时间(帐号锁定之后的最后一次尝试间隔timeToIdleSeconds秒之后自动清除)。

public class RetryLimitCredentialsMatcher extends HashedCredentialsMatcher {

//集群中可能会导致出现验证多过5次的现象,因为AtomicInteger只能保证单节点并发
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();
        //retry count + 1
        AtomicInteger retryCount = passwordRetryCache.get(username);
        if(null == retryCount) {
            retryCount = new AtomicInteger(0);
            passwordRetryCache.put(username, retryCount);
        }
        if(retryCount.incrementAndGet() > 5) {
            logger.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 data
              passwordRetryCache.remove(username);
         }
         return matches;
    }
}
  1. Spring配置CacheManager
<bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcacheManager"/>
    </bean>

    <!--ehcache-->
    <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache/ehcache.xml"/>
    </bean>
  1. Ehcache配置
<ehcache name="es">

    <diskStore path="java.io.tmpdir"/>

    <!-- 登录记录缓存 锁定100分钟 -->
    <cache name="passwordRetryCache"
           maxEntriesLocalHeap="20000"
           eternal="false"
           timeToIdleSeconds="36000"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="false">
    </cache>

</ehcache>
  1. Spring Shiro配置

    UserRealm继承AuthorizingRealm,在其父类AuthenticatingRealm的getAuthenticationInfo方法中会调用credentialsMatcher的

    doCredentialsMatch

    来验证用户输入用户名密码是否匹配。

<bean id="credentialsMatcher" class="com.cloud.service.security.credentials.RetryLimitCredentialsMatcher">
        <constructor-arg ref="springCacheManager"/>
        <property name="storedCredentialsHexEncoded" value="true"/>
 </bean>
 <bean id="myRealm" class="com.cloud.service.security.UserRealm">
        <property name="credentialsMatcher" ref="credentialsMatcher"/>
        <property name="cachingEnabled" value="false"/>
        <!--<property name="authenticationCachingEnabled" value="true"/>-->
        <!--<property name="authenticationCacheName" value="authenticationCache"/>-->
        <!--<property name="authorizationCachingEnabled" value="true"/>-->
        <!--<property name="authorizationCacheName" value="authorizationCache"/>-->
    </bean>
时间: 2024-07-29 18:11:39

Shiro security限制登录尝试次数的相关文章

Spring Security笔记:登录尝试次数限制

今天在前面一节的基础之上,再增加一点新内容,默认情况下Spring Security不会对登录错误的尝试次数做限制,也就是说允许暴力尝试,这显然不够安全,下面的内容将带着大家一起学习如何限制登录尝试次数. 首先对之前创建的数据库表做点小调整 一.表结构调整 T_USERS增加了如下3个字段: D_ACCOUNTNONEXPIRED,NUMBER(1) -- 表示帐号是否未过期D_ACCOUNTNONLOCKED,NUMBER(1), -- 表示帐号是否未锁定D_CREDENTIALSNONEXP

DenyHosts限制SSH登录尝试次数

DenyHosts官方网站为:http://denyhosts.sourceforge.net 1. 安装 # tar -zxvf DenyHosts-2.6.tar.gz # cd DenyHosts-2.6 # python setup.py install 默认是安装到/usr/share/denyhosts目录的. 2. 配置 # cd /usr/share/denyhosts/ # cp denyhosts.cfg-dist denyhosts.cfg # vi denyhosts.c

使用Pam_Tally2锁定和解锁SSH失败的登录尝试

am_tally2模块用于某些数对系统进行失败的ssh登录尝试后锁定用户帐户. 此模块保留已尝试访问的计数和过多的失败尝试. pam_tally2模块有两个部分,一个是pam_tally2.so,另一个是pam_tally2. 它是基于PAM模块上,并且可以被用于检查和调节计数器文件. 它可以显示用户登录尝试次数,单独设置计数,解锁所有用户计数. Pam_tally2锁定SSH登录 默认情况下,pam_tally2模块已经安装在大多数Linux发行版,它是由PAM包本身的控制. 本文演示如何锁定

oracle关于密码尝试次数的设置

原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/42417761 实验环境 操作系统 WIN7 64bit 数据库 oracle 11G R2(11.2.0.1.0) 前提:用户登陆尝试密码错误过多时,会造成用户被锁定. 实验: 使用PL/SQL Developer模拟scott用户多次密码输入错误时会提示"

Shiro 自己实现登录后重新生成sessionid

Shiro Security是非常不错的Security框架,我们系统在使用过程中发现Shiro在登录之后不会生成新的Jessionid.这显然会出现Session_Fixation.Shiro自己说会在下一个版本1.3 fix这个问题,在这之前只能学Spring Security来实现重新生成Session.其实简单就是在登陆之后把session数据复制一份到新的session. Shiro中要做到这一点可以通过实现可以通过继承org.apache.shiro.web.filter.authc

Linux 服务器和Windows服务器 用户登录失败次数限制【互联网金融系统漏洞排查】

1.Linux服务器用户登录失败次数限制(使用pam模块实现) /etc/pam.d/sshd    (远程ssh) /etc/pam.d/login    (终端) 1.1.用户通过ssh登录失败次数的限制 第一步)需要使用pam模块来实现此功能,检查是否有pam_tally2.so文件 # find /lib* -name pam_tally2.so /lib64/security/pam_tally2.so 第二步)修改配置文件: # vi /etc/pam.d/sshd #%PAM-1.

shell脚本精华----在10秒内SSH登录失败次数超过3次就使用iptables/tcpwrappers拒绝

#!/bin/bash while true do badip=$(lastb -i -a | awk '/ssh:notty/ {print $NF}'|sort|uniq -c|awk '($1>3) {print $2}') for i in $badip do iptables -t filter -I INPUT -s $i -p tcp --dport 22 -j DROP done : > /var/log/btmp sleep 10s done shell脚本精华----在10

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(二)基于SpringMVC+Shiro的用户登录权限验证

序: 在上一篇中,咱们已经对于项目已经做了基本的配置,这一篇文章开始学习Shiro如何对登录进行验证. 教学: 一.Shiro配置的简要说明. 有心人可能注意到了,在上一章的applicationContext.xml配置文件中,包含以下配置. <!-- 項目自定义的Realm --> <bean id="shiroDbRealm" class="org.shiro.demo.service.realm.ShiroDbRealm" ><

mapreduce任务出错最大尝试次数

一个任务出现失败时,tasktracker会将此任务的失败信息报告给jobtracker,jobtracker会分配新的节点执行此任务.这种情况下不会影响整个作业的完整执行.但是如果容易任务出现多次失败,且失败次数超出失败的最大指定次数,那么作业会在未完成的情况下被终止. mapred-site.xml: hadoop1.x: mapred.max.map.attempts mapred.max.reduce.attempts hadoop2.x: <property> <name>