最近有需求需要对单点登录(cas3.5),用户次数和时间进行限制,例如ghf用户在1分钟内密码错误次数超过三次禁止登录,锁定1分钟,网上很多说配置throttleInterceptor,但最后发现是对频率的限制,以下是参数解释:
thresholdRate = (double) failureThreshold / (double) failureRangeInSeconds
failureRangeInSeconds 失败范围时间 :多少秒内失败算一次;例如10,表示 10秒为一个周期,这个周期内失败次数累加,超过10秒,重新开始;同时也表示锁定时间。
总结来说即在一秒内用户错误登录的频率大于failureThreshold/failureRangeInSeconds时候,就会被阻止。显然根本实现不了需求,看到有文章说使用日志审计功能可以,特意进行了修改,基本完成需求,仍然有小问题,有时间优化以下吧!
参考文章:https://blog.csdn.net/zhurhyme/article/details/37535697
总体思路是,用户登录日志插入CAS_LOG表中,用户每登录一次就记录一条数据,登录成功失败记录信息不一致,在程序内部查询最近几分钟(例如1分钟)内几(例如3次)次登录失败的次数,超过规定次数跳转到提示页面。修改后时间、次数、表名都可以配置。因为cas默认日志审计默认是COM_AUDIT_TRAIL表,不符合公司项目默认建表规范,需要修改。
以下是修改过程:
1.新建WEB-INF/spring-configuration/throttleInterceptorTrigger.xml文件
注释第一部分是在内存中进行限制的方法,不满足需求,第二部分是cas原生的日志审计功能,需要修改。最后是代码部分是真正的配置信息,注意红色部分。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!--failureThreshold/failureRangeInSeconds thresholdRate = (double) failureThreshold / (double) failureRangeInSeconds failureRangeInSeconds 失败范围时间 :多少秒内失败算一次;例如10,表示 10秒为一个周期,这个周期内失败次数累加,超过10秒,重新开始;同时也表示锁定时间。 即在一秒内用户错误登录的频率大于failureThreshold/failureRangeInSeconds时候,就会被阻止 1000.0 / (当前时间.getTime() - 上次登录时间.getTime()) 警告语句:Throttling submission from 127.0.0.1. More than 2 failed login attempts within 300 seconds. --> <!--<bean id="throttleInterceptor"--> <!--class="org.jasig.cas.web.support.InMemoryThrottledSubmissionByIpAddressAndUsernameHandlerInterceptorAdapter"--> <!--p:failureRangeInSeconds="180"--> <!--p:failureThreshold="3" />--> <!--<bean id="throttleInterceptor" class="org.jasig.cas.web.support.InspektrThrottledSubmissionByIpAddressAndUsernameHandlerInterceptorAdapter"--> <!--p:failureRangeInSeconds="30"--> <!--p:failureThreshold="3">--> <!--<constructor-arg index="0" ref="auditTrailManager" />--> <!--<constructor-arg index="1" ref="dataSource" />--> <!--</bean>--> <!--failureRangeInSeconds 多长时间内错误,这个时代段内的错误次数会进行统计,单位秒 failureThreshold 允许失败次数,、即超多规定次数锁定,禁止同ip用户同用户登录。 --> <bean id="throttleInterceptor" class="org.jasig.cas.web.support.MyInspektrThrottledSubmissionByIpAddressAndUsernameHandlerInterceptorAdapter" p:failureRangeInSeconds="60" p:failureThreshold="3" p:tableName="CAS_LOG"> <constructor-arg index="0" ref="auditTrailManager" /> <constructor-arg index="1" ref="dataSource" /> </bean> </beans>