您的位置:首页 > 编程语言 > Java开发

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

2014-07-20 22:33 387 查看
今天在前面一节的基础之上,再增加一点新内容,默认情况下Spring Security不会对登录错误的尝试次数做限制,也就是说允许暴力尝试,这显然不够安全,下面的内容将带着大家一起学习如何限制登录尝试次数。

首先对之前创建的数据库表做点小调整

一、表结构调整

T_USERS增加了如下3个字段:

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd"> 
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/admin**" access="hasRole('ADMIN')" />
<!-- access denied page -->
<access-denied-handler error-page="/403" />
<form-login login-page="/login" default-target-url="/welcome"
authentication-failure-url="/login?error" username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/login?logout" />
<csrf />
</http>

<beans:bean id="userDetailsDao"
class="com.cnblogs.yjmyzz.dao.impl.UserDetailsDaoImpl">
<beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="customUserDetailsService"
class="com.cnblogs.yjmyzz.service.CustomUserDetailsService">
<beans:property name="usersByUsernameQuery"
value="SELECT d_username username,d_password password, d_enabled enabled,d_accountnonexpired accountnonexpired,d_accountnonlocked accountnonlocked,d_credentialsnonexpired credentialsnonexpired FROM t_users WHERE d_username=?" />
<beans:property name="authoritiesByUsernameQuery"
value="SELECT d_username username, d_role role FROM t_user_roles WHERE d_username=?" />
<beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="authenticationProvider"
class="com.cnblogs.yjmyzz.provider.LimitLoginAuthenticationProvider">
<beans:property name="passwordEncoder" ref="encoder" />
<beans:property name="userDetailsService" ref="customUserDetailsService" />
<beans:property name="userDetailsDao" ref="userDetailsDao" />
</beans:bean>

<beans:bean id="encoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
<beans:constructor-arg name="strength" value="9" />
</beans:bean>

<authentication-manager>
<authentication-provider ref="authenticationProvider" />
</authentication-manager>

</beans:beans>


View Code
跟之前的变化有点大,47行是核心,为了实现47行的注入,需要33-38行,而为了完成authenticationProvider所需的一些property的注入,又需要其它bean的注入,所以看上去增加的内容就有点多了,但并不难理解。

五、运行效果

连续3次输错密码后,将看到下面的提示



这时如果查下数据库,会看到



错误尝试次数,在db中已经达到阀值3



而且该用户的“是否未锁定”字段值为0,如果要手动解锁,把该值恢复为1,并将T_USER_ATTEMPTS中的尝试次数,改到3以下即可。

源代码下载:SpringSecurity-Limit-Login-Attempts-XML.zip
参考文章:
Spring Security : limit login attempts example
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: