SpringSecurity密码错误指定次数锁定用户

阅读: 评论:0

SpringSecurity密码错误指定次数锁定用户

SpringSecurity密码错误指定次数锁定用户

思路参考:

Java中SpringSecurity密码错误5次锁定用户的实现方法_JAVA教程_服务器之家

异常抛出参考:     spring cloud oauth2 登录一定次数后锁定_hqmeng的博客-CSDN博客_oauth 用户被锁定  

自己写的:

===============================1、失败锁定账号==========================

登录失败的监听处理(失败次数累加、超过则锁定)

@Component
public class AuthenticationFailureListener implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {@Value("${loginMgmt.loginErrorMax}")private Integer loginErrorMax;//#登录错误最大次数(锁定)@AutowiredITSysOpService itSysOpService;@Overridepublic void onApplicationEvent(AuthenticationFailureBadCredentialsEvent authenticationFailureBadCredentialsEvent) {String account = Authentication().getPrincipal().toString();//登录账号TSysOp tSysOp = itSysOpService.queryByUserName(account);if(tSysOp!=null){Integer hasErrorCount= 错误次数();//数据库(已经登录错误次数)hasErrorCount=(hasErrorCount!=null)?hasErrorCount:0;hasErrorCount++;if(hasErrorCount>=loginErrorMax){//超过最大错误次数(锁定)tSysOp.set状态("2");//锁定tSysOp.set错误次数(hasErrorCount);//错误次数tSysOp.set锁定时间(new Date());//锁定时间itSysOpService.updateOperator(tSysOpe);throw new LockedException("登录失败超"+loginErrorMax+"次,账号已被锁定!");}else{//否则不锁定,错误次数加1tSysOp.set错误次数(hasErrorCount);//错误次数itSysOpService.updateOperator(tSysOp);int hasChance=loginErrorMax-hasErrorCount;throw new LockedException("登录失败,还有"+hasChance+"次登录机会!");}}}
}

登录成功的监听处理(置为未锁定、登录错误次数置为0)

@Component
public class AuthenticationSuccessEventListener implements ApplicationListener<AuthenticationSuccessEvent> {@AutowiredITSysOpService itSysOpService;/*** 登录成功监听* 登录成功(根据登录账号设置用户未锁定、登录错误次数置为0)* @param authenticationSuccessEvent*/@Overridepublic void onApplicationEvent(AuthenticationSuccessEvent authenticationSuccessEvent) {MySecurityUser mySecurityUser =(Authentication().getPrincipal();String account&#Username();//登录账号TSysOp tSysOp = itSysOpService.queryByUserName(account);tSysOp.set状态("1");//未锁定tSysOp.set错误次数(0);//错误登录检查次数置为0itSysOpService.updateOperator(tSysOp);//更新账号信息}
}

======================2、根据数据库状态登录时给出报错==================

将数据库锁定状态传给springsecurity用户对象

/*** 权限验证相关接口实现*/
@Service
public class SecurityAuthInterfaceImpl implements SecurityAuthInterface {@Overridepublic MySecurityUser findUserByUserName(String userName) {TSysOp user = userService.queryByUserName(userName);//根据账号查询数据库if (user == null) {return null;}String stateStr&#状态();//锁定状态Integer stateInt=StringValid.isValid(stateStr)?Integer.valueOf(stateStr):0;return new fCode(), fPassword(), stateInt, fOpId());}

根据传递状态判断是否锁定

@Autowired
private SecurityAuthInterface userRoleInterface;@Component
public class MySecurityUserDetails implements UserDetailsService {public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {logger.info("-------------你输入的用户名为:" + name);MySecurityUser user = this.userRoleInterface.findUserByUserName(name);if (user == null) {logger.info("-------------未查询到用户名:" + name);throw new UsernameNotFoundException("Invalid username or password.");} else {状态()==2){//用户被锁定throw new InternalAuthenticationServiceException("该账号已被锁定,请联系管理员!");}List<MySecurityRole> roles = 根据用户id查询用户角色return new Username(), Password(), State(), roles);}}
}

======================3、将登录失败提示到前端展示======================

@Component("authenctiationFailureHandler")
public class AuthenctiationFailureHandler extends SimpleUrlAuthenticationFailureHandler {private Logger logger = Class());public AuthenctiationFailureHandler() {}public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {this.logger.info("----------------登录失败------------------------");String msg = "";if (!(exception instanceof UsernameNotFoundException) && !(exception instanceof BadCredentialsException)) {if(exception instanceof LockedException){//用户被锁定、将要被锁定(AuthenticationFailureListener类--登录失败时)msg&#Message();}else if (exception instanceof DisabledException) {msg = "账户被禁用,登录失败,请联系管理员!";}else if(exception instanceof InternalAuthenticationServiceException){//用户被锁定、无效(MySecurityUserDetails类--用户名密码正确,用户状态非正常)msg&#Message();}else {msg = "登录失败!";}}else{msg = "登录失败,用户名或密码输入错误!";}().filter(request, response, ().error(2, msg, new Object[0]), (Integer)null);}
}

本文发布于:2024-01-31 13:59:24,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170668076229028.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:次数   错误   密码   用户   SpringSecurity
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23