`

Shiro security限制登录尝试次数

 
阅读更多
http://blog.csdn.net/cloud_ll/article/details/44124189
之前讲了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; 
    }
} 

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> 

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> 

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>
分享到:
评论

相关推荐

    springboot整合shiro登录失败次数限制功能的实现代码

    主要介绍了springboot整合shiro-登录失败次数限制功能,实现此功能如果是防止坏人多次尝试,破解密码的情况,所以要限制用户登录尝试次数,需要的朋友可以参考下

    SpringBoot+Shiro学习之密码加密和登录失败次数限制示例

    Shiro 框架提供了自定义的登录失败次数限制机制,开发者可以根据需要自定义登录失败次数限制规则。 在本示例中,我们使用 Shiro 框架来实现登录失败次数限制,并使用 SpringBoot 框架来实现密码加密。我们首先使用 ...

    shiro-登录失败次数限制.zip

    shiro-登录尝试次数限制

    ssm+shiro+redis 登录控制及重试次数超过5次账号锁定一分钟

    shiro+redis 实现登录控制及密码重试次数超过5次后账号锁定一分钟不能登录

    shiro管理多登录入口配置,手机端登录与网页端登录

    在"shiro管理多登录入口配置,手机端登录与网页端登录"这个场景下,我们需要考虑如何为不同的登录入口(手机端和网页端)设置独立的验证流程。 首先,Shiro 的核心组件 Realm 负责与应用数据源交互,验证用户身份。...

    SpringBoot整合Shiro后实现免密登录

    SpringBoot整合Shiro后实现免密登录 1,说明一下步骤,需要在原来基础新增三个文件 2,新增CustomToken,重写UsernamePasswordToken免密登录调用方法和密码登录调用方法都在里面。 3,新增...

    Springboot+shiro单点登录实现.md

    Springboot+shiro单点登录实现,本文档是单点登录的全部源代码。

    springmvc+shiro 实现安全登录的demo

    实现了shiro安全登录,包括密码加密匹配和登录失败次数限制的功能

    shiro实现单点登录

    通过以上步骤,我们便能成功地利用Spring、Shiro、Spring Data Redis和Spring Session Data Redis实现单点登录功能。这个解决方案不仅提供了便捷的用户体验,还降低了系统复杂性,提高了安全性。在实际开发中,可以...

    Shiro+Spring Security学习文档

    在IT安全领域,Apache Shiro和Spring Security是两个非常重要的框架,它们主要用于应用程序的安全管理,包括身份验证、授权、会话管理和加密等。本学习文档集合了这两个框架的相关知识,旨在帮助开发者深入理解和...

    cas结合 springmvc shiro 单点登录

    5. **登录与登出流程**:当用户尝试访问受保护的资源时,如果未登录,会被重定向到CAS登录页面。成功登录后,CAS会返回一个票据给客户端,客户端再将此票据提交给Shiro进行验证。验证通过后,用户即可访问受保护资源...

    shiro简单登录+logback日志记录

    通常我们会创建一个Controller接收用户提交的登录信息,然后调用Subject的login方法进行登录尝试。如果登录成功,Subject会自动记住用户身份;失败时,Shiro会抛出异常,我们可以捕获这个异常并给出相应的提示。 3....

    shiro获取登录状态和用户信息

    ### Shiro 获取登录状态与用户信息 在Java Web开发领域,Apache Shiro 是一个非常流行的权限管理框架。它提供了一套完整的认证、授权、加密和会话管理功能。本篇文章将详细介绍如何通过Shiro框架来获取用户的登录...

    springboot+redis+shiro单点登录,统一异常处理,统一日志

    总结起来,这个项目将SpringBoot的便捷性与Shiro的安全控制和Redis的高速缓存相结合,实现了高效的SSO单点登录,同时提供了统一的异常处理和日志管理机制,提高了系统的稳定性和用户体验。这是一套完整的解决方案,...

    shiro+spring+data+session+redis实现单点登录

    1. **用户登录**:用户尝试访问任一系统,如果未登录,则重定向至登录页面。 2. **认证过程**:用户提交登录信息,Shiro进行验证,成功后创建会话并存储用户信息。 3. **会话存储**:Shiro将会话信息(包括用户ID、...

    shiro-单用户登录.zip

    在"shiro-单用户登录.zip"这个压缩包中,我们很显然是关注Shiro如何实现单用户的登录逻辑。Shiro 提供了丰富的API和组件,使得开发者能够快速集成到自己的应用中,实现用户的身份验证和授权。 1. **Shiro基础概念**...

    SSM+shiro登录控制

    在"shiro控制使用跳转链接前必须登录"的场景下,Shiro通常会在用户尝试访问受保护资源时进行拦截。如果用户未登录,Shiro会将请求重定向到登录页面。实现这一功能的关键在于配置Shiro的Web过滤器。在`web.xml`中,...

    Java SSM、 shiro开发用户登录权限认证的实例demo

    Java SSM(Spring、Spring MVC、MyBatis)与Apache Shiro框架的结合使用,是构建Web应用中用户登录权限认证的一种常见方案。本实例demo将深入探讨如何利用这两个强大的工具来实现安全、高效的用户身份验证和授权。 ...

Global site tag (gtag.js) - Google Analytics