网站建设人员管理制度,做影视网站侵权,网站模板怎么上传,青岛的seo服务公司1 引言
系统为了避免密码遭到暴力破解#xff0c;通常情况下需要在登录时#xff0c;限制用户验证账号密码的次数#xff0c;当达到一定的验证次数后#xff0c;在一段时间内锁定该账号#xff0c;不再验证。本章将用几行代码实现该功能#xff0c;完整代码链接在文章最…1 引言
系统为了避免密码遭到暴力破解通常情况下需要在登录时限制用户验证账号密码的次数当达到一定的验证次数后在一段时间内锁定该账号不再验证。本章将用几行代码实现该功能完整代码链接在文章最后。
2 原理介绍
可以看到在登录接口中4行代码即可实现该功能这里使用Redis可以很方便的记录“登录失败次数”以及设置其失效时间即锁定时间主要步骤是
账号登录时当前账号“登录失败次数”默认1。设置“登录失败次数”失效的时间即锁定时间。当“登录失败次数”大于某个阈值时就直接返回错误提示不再走验证逻辑。账号登录成功清除“登录失败次数”重新计数。
注意第2步和第3步可以交换顺序。 第2步在前时锁定中发起请求会导致重新计时。 第3步在前时锁定中发起请求不会导致重新计时。 3 代码
isTrue是断言方法不满足条件时抛出异常在全局异常处理中统一返回错误提示。参见Spring全局异常处理HandlerExceptionResolver使用。
package com.zeroone.service.sys;import com.zeroone.common.RedisKey;
import com.zeroone.entity.sys.User;
import com.zeroone.service.BaseService;
import com.zeroone.utils.Param;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;Service(UserService)
public class LoginServiceImpl extends BaseService implements LoginService {Overridepublic Object webLogin(Param info) {String account info.getStringNotNull(account).trim();String password info.getStringNotNull(password).trim();Long loginFailedCount redisTemplate.opsForValue().increment(RedisKey.LOGIN_FAILED_COUNT account, 1);//先将登录失败次数1redisTemplate.expire(RedisKey.LOGIN_FAILED_COUNT account, 10, TimeUnit.SECONDS);// 指定登录失败次数失效时间isTrue(loginFailedCount 5, 请10秒后重试);//当登录失败次数大于阈值后直接返回错误信息//TODO 模拟验证密码isTrue(password.equals(12345), 账号或密码错误,还能重试 (5 - loginFailedCount) 次!);redisTemplate.delete(RedisKey.LOGIN_FAILED_COUNT account);// 验证通过后清除登录失败次数User user new User();user.setId(1L);user.setName(张三);user.setAccount(12345678901qq.com);user.setPhone(12345678901);String token tokenService.createToken(user);return token;}Overridepublic void logout() {tokenService.deleteToken();}
} /*** true断言** param expression 参数* param msg 描述*/public void isTrue(boolean expression, String msg) {if (!expression) {throw new MyRuntimeException(HttpCode.BAD_REQUEST_CODE, msg);}}4 测试
启动项目请求http://localhost:8080/web/login输入错误的密码提示账号或密码错误,还能重试X次!。 2. 然后连续验证错误5次后提示请10秒后重试表示该账号被锁定拒绝验证且10秒内无法再次请求验证。
5 完整代码
Gitee代码链接