java后台实现多次登陆失败锁定用户账户

1.实现方法:

1.集成Spring Security框架[里边有登陆成功和失败的监听]

2.集成Redis框架

2.具体实现思路

1.用户输入错误密码登陆失败的监听


@Component
public class LoginLimitFailed implements ApplicationListener<AuthenticationFailureBadCredentialsEvent>{
	@Autowired
	private SysUserMapper userMapper;
	@Autowired
	private RedisTemplate redisTemplate;

	private final ISysConfigService configService;
	@Autowired
	public LoginLimitFailed(ISysConfigService configService){
		this.configService = configService;
	}

	@Override
	public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent authenticationFailureBadCredentialsEvent){
		String username = authenticationFailureBadCredentialsEvent.getAuthentication().getPrincipal().toString();
		SysUser sysUser = userMapper.selectUserByUserName(username);
		Object o = redisTemplate.opsForValue().get(username+"Count");
		if(o==null){
			redisTemplate.opsForValue().set(username+"Count",0);
		}
		Object o1 = redisTemplate.opsForValue().get(username+"Count");
		long l = Long.parseLong(o1.toString());
		l+=1;
		
		redisTemplate.opsForValue().set(username+"Count",l);
		if(l==5||l>5){
			sysUser.setStatus("1"); //锁定用户
			userMapper.updateUser(sysUser);
			//一段时间后解锁[在后台设置的参数:单位秒]
			new Thread(){
				@Override
				public void run(){
					try{
						String keyTime = configService.selectConfigByKey("keyTime");
						sleep(Long.parseLong(keyTime)*1000);
						sysUser.setStatus("0"); //解锁
						userMapper.updateUser(sysUser);
						redisTemplate.opsForValue().set(username+"Count",0);
					}Catch(Exception e){
						e.printStackTrace();
					}
				}
			}.start();
		}
		System.out.println("这是密码输入的错误次数==>"+l);
	}
}

2.用户输入密码成功登陆的监听

@Component
public class LoginLimitSuccess implements ApplicationListener<AuthenticationSuccessEvent>{
	@Autowired
	private RedisTemplate redisTemplte;
	@Override
	public void onApplicationEvent(AuthenticationSuccessEvent authenticationSuccessEvent){
		Object principal = authenticationSuccessEvent.getAuthentication().getPrincipal();
	}
}

3.登陆成功的接口[若依方法的登陆接口,登陆成功后redis缓存账户登陆失败记录次数清零]

@PostMapping("/login")
@ApiOperation("登陆方法")
public Response<TokenDTO> login(@RequestBody LoginBody loginBody){
	TokenDTO tokenDTO = new TokenDTO();
	String token = "";
	if(loginBody.getUsername()!=null && !loginBody.getUsername().equals("")){
		token = loginSerive.login(loginBody.getUsername(),loginBody.getPassword(),loginBody.getCode(),loginBody.getUuid());
	}else{
		token = loginService.login(loginBody.getPhonenumber());
	}
	tokenDTO.setToken(token);
	String username = loginBody.getUsername();
	redisTemplate.opsForValue().set(username+"Count",0);
	return Response.success(tokenDTO);
}

 

可以通过以下Java代码实现账号登录失败超过五次后锁定账号30分钟的功能: 1. 首先,需要在用户对象中添加一个字段,用于记录用户登录失败的次数以及最后一次登录失败的时间: ```java public class User { private String username; private String password; private int loginFailCount; private long lastLoginFailTime; // 省略 getter 和 setter 方法 } ``` 2. 然后,在用户登录失败的方法中,判断用户的登录失败次数是否超过五次,如果超过五次,则更新用户的登录失败时间和失败次数,并判断当前时间与上一次登录失败时间的时间差是否大于30分钟,如果大于30分钟,则重置用户的登录失败次数和时间,否则锁定账号并返回错误信息: ```java public String login(String username, String password) { User user = getUserByUsername(username); if (user == null || !user.getPassword().equals(password)) { // 用户名或密码错误 user.setLoginFailCount(user.getLoginFailCount() + 1); user.setLastLoginFailTime(System.currentTimeMillis()); if (user.getLoginFailCount() >= 5) { long timeDiff = System.currentTimeMillis() - user.getLastLoginFailTime(); if (timeDiff < 30 * 60 * 1000) { // 锁定账号 return "账号已被锁定,请30分钟后再试。"; } else { user.setLoginFailCount(0); user.setLastLoginFailTime(0); } } return "用户名或密码错误。"; } else { // 登录成功 user.setLoginFailCount(0); user.setLastLoginFailTime(0); return "登录成功。"; } } ``` 以上代码实现了当用户登录失败次数超过五次后,如果距离上一次登录失败时间不足30分钟,则锁定账号,否则重置登录失败次数和时间。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值