在上一次写的文章中,为大家说到了如何动态的从数据库加载用户、角色、权限信息,从而实现登录验证及授权。在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登录失败的时候,我们应该将账户锁定,等待一定的时间之后才能再次进行登录操作。

一、基础知识回顾

要实现多次登录失败账户锁定的功能,我们需要先回顾一下基础知识:Spring Security 不需要我们自己实现登录验证逻辑,而是将用户、角色、权限信息以实现UserDetails和UserDetailsService接口的方式告知Spring Security。具体的登录验证逻辑Spring Security 会帮助我们实现。

UserDetails接口中有一个方法叫做isAccountNonLocked()用于判断账号是否被锁定,也就是说我们应该通过该方法对应的set方法setAccountNonLocked(false)告知Spring Security该登录账户被锁定。

那么应该在哪里判断账号登录失败的次数并执行锁定机制呢?当然是我们之前文章给大家介绍的《自定义登录成功及失败结果处理》的AuthenticationFailureHandler。

建议您先阅读本文,如果您对本文的实现过程感到迷惑,建议您再翻看本号之前的相关内容。

二、实现多次登录失败锁定的原理

一般来说实现这个需求,我们需要针对每一个用户记录登录失败的次数nLock和锁定账户的到期时间releaseTime。具体你是把这2个信息存储在mysql、还是文件中、还是redis中等等,完全取决于你对你所处的应用架构适用性的判断。具体的实现逻辑无非就是:登陆失败之后,从存储中将nLock取出来加1。

如果nLock大于登陆失败阈值(比如3次),则将nLock=0,然后设置releaseTime为当前时间加上锁定周期。通过setAccountNonLocked(false)告知Spring Security该登录账户被锁定。

如果nLock小于等于1,则将nLock再次存起来。

在一个合适的时机,将锁定状态重置为setAccountNonLocked(true)。

这是一种非常典型的实现方式,笔者向大家介绍一款非常有用的开源软件叫做:ratelimitj。这个软件的功能主要是为API访问进行限流,也就是说可以通过制定规则限制API接口的访问频率。那恰好登录验证接口也是API的一种啊,我们正好也需要限制它在一定的时间内的访问次数。

三、具体实现

首先需要将ratelimitj通过maven坐标引入到我们的应用里面来。我们使用的是内存存储的版本,还有redis存储的版本,大家可以根据自己的应用情况选用。

es.moki.ratelimitj

ratelimitj-inmemory

0.4.1

之后通过继承SimpleUrlAuthenticationFailureHandler ,实现onAuthenticationFailure方法。该实现是针对登录失败的结果的处理,在我们之前的文章中已经讲过。

@Component

public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

@Autowired

UserDetailsManager userDetailsManager;

//规则定义:1小时之内5次机会,就触发限流行为

Set rules =

Collections.singleton(RequestLimitRule.of(1 * 60, TimeUnit.MINUTES,5));

RequestRateLimiter limiter = new InMemorySlidingWindowRequestRateLimiter(rules);

@Override

public void onAuthenticationFailure(HttpServletRequest request,

HttpServletResponse response,

AuthenticationException exception)

throws IOException, ServletException {

String userId = //从request或request.getSession中获取登录用户名

//计数器加1,并判断该用户是否已经到了触发了锁定规则

boolean reachLimit = limiter.overLimitWhenIncremented(userId);

if(reachLimit){ //如果触发了锁定规则,通过UserDetails告知Spring Security锁定账户

user.setAccountNonLocked(false);

userDetailsManager.updateUser(user);

SysUser user = (SysUser) userDetailsManager.loadUserByUsername(userId);

}

//此处省略通过response做json或html响应

}

}核心实现注意看代码中的注释

代码中的SysUser为UserDetails的实现类,如果不知道如何实现请参考本号之前的文章

userDetailsManager被用于管理UserDetails信息,通过改变UserDetails改变Spring Security验证行为。

四、重置锁定状态的时机

user.setAccountNonLocked(true);

重置锁定状态很简单,就是上面的代码。但是更重要的是如何选择重置锁定状态的时机。笔者能想到几种方案如下下一次登陆的时候,自定义过滤器,加在Spring Boot过滤器链最前端做锁定状态重置的判断。

当登录账户被锁定之后,之后用户的每一次登录都会抛出LockedException。我们完全可以通过Spring Boot的全局异常捕获机制,在其中捕获LockedException,并做锁定状态的判断及重置行为。

写一个Spring 的定时器轮询,当然这是最差的方案。

期待您的关注本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

mysql 用户 多次登录失败_Spring Security之多次登录失败后账户锁定功能的实现相关推荐

  1. java登录失败三次一小时后再等_Spring Security实现多次登录失败后账户锁定功能...

    在上一次写的文章中,为大家说到了如何动态的从数据库加载用户.角色.权限信息,从而实现登录验证及授权.在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登录失败的时候,我们应该将账户锁定,等待一 ...

  2. 登录判断_Spring Security之多次登录失败后账户锁定功能的实现

    在上一次写的文章中,为大家说到了如何动态的从数据库加载用户.角色.权限信息,从而实现登录验证及授权.在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登录失败的时候,我们应该将账户锁定,等待一 ...

  3. springsecurity 登录失败_Spring Security 实战干货: 401和403状态

    1. 前言 最近几篇我对Spring Security中用户认证流程进行了分析,同时在分析的基础上我们实现了一个验证码登录认证的实战功能.当认证失败后交给了AuthenticationFailureH ...

  4. java如何记住登录状态_Spring security实现记住我下次自动登录功能过程详解

    一.原理分析 第一次登陆时,如果用户勾选了readme选项,登陆成功后springsecurity会生成一个cookie返回给浏览器端,浏览器下次访问时如果携带了这个cookie,springsecu ...

  5. 基于Spring Security的认证授权_自定义登录页面_Spring Security OAuth2.0认证授权---springcloud工作笔记127

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们再去看自定义登录页面,之前我们使用的都是springsecurity提供的登录页面,肯定不 ...

  6. mysql用户连接次数失败限制_mysql数据库限制多次登录失败,限定用户重试时间...

    前言 最近的项目开始进行安全测试,其中有一个安全问题是这样的. 应该增加用户登录失败处理功能,限制非法登录次数. 建议是增加mysql数据库的登陆失败的锁定功能. 相信大家也都会遇到这样的问题,在这里 ...

  7. java 登录踢出_spring security 4 如何踢出用户?

    项目用的是spring boot 1.3 全javaconfig 配置 目的 : 我要踢出一个登录在线的用户,踢出后,剔出的用户再次访问服务器的时候会去到登录界面, security 配置 : htt ...

  8. 计算机调试致sa登录失败,无法打开登录 'xxxx' 中请求的数据库。登录失败。用户 'sa' 登录失败。解决思路...

    当前位置:我的异常网» Sql Server » 无法打开登录 'xxxx' 中请求的数据库.登录失败.用 无法打开登录 'xxxx' 中请求的数据库.登录失败.用户 'sa' 登录失败.解决思路 w ...

  9. mysql用户控制登录_MySql用户权限控制_MySQL

    bitsCN.com MySql用户权限控制 本文将介绍MySql创建帐号,删除帐号,设置和介绍各种帐号的权限 创建用户帐号: www.bitsCN.com [sql] CREATE USER use ...

最新文章

  1. linux下将硬件时钟调整为与本地时钟一致
  2. 【聚类算法】sklearn聚类方法详解
  3. jar包让别人看不到代码_【求助】反编译查看jar包的源代码,出现如下问题,求解单...
  4. python怎么重复程序_利用Python程序完成ABAQUS中的一些重复性操作
  5. drools规则引擎中易混淆语法分析_相互触发导致死循环分析
  6. oracle如何增加磁盘,牛刀小试Oracle之ORACLE 11GR2 RAC安装配置-asm磁盘组配置添加(四)...
  7. 仿百度文库解决方案(一)——总体思路
  8. ionic 图片显示在屏幕中间_iPad屏幕坏点亮点怎么看 自查iPad屏幕坏点亮点方法【详解】...
  9. PIC18单片机移植FreeModbus
  10. 搭建物联网服务器测试环境
  11. React中ref的三种获取方式
  12. 斐讯k2怎么设置虚拟服务器,设置斐讯K2路由器上网连接教程 | 192路由网
  13. DIY面试题 for AI产品经理 | “智能音箱半夜诡异笑声”的原因分析及建议方案
  14. c#做一个身份信息查询系统
  15. 可穿戴市场掘金:VC如何看上小小的ZEPP公司
  16. Gitee使用流程及其注意事项
  17. 家居装修知识 装修注意事项需牢记
  18. 科利转债上市价格预测
  19. 字节跳动招聘研究型实习生
  20. PLC采集网关实现电力行业 DT/L645 接入华为云平台

热门文章

  1. 我的第“一”篇博客--自我介绍
  2. 医院计算机怎么评职称,医院设备科主要是干什么的?医院设备科怎么评职称?...
  3. c语言判断四个人说真话,心理学:有三种方式,可以判断一个人是在说真话还是在撒谎...
  4. 6项发展助推中国成为“全球数据中心”
  5. Cinemachine学习记录
  6. EOS内存RAM买卖详解
  7. cns播客_Hanselminutes播客10
  8. 30多岁了仍一事无成,除了去工厂上班还有哪些出路?
  9. Cesium示例程序学习和讲解(3)-三维模型着色
  10. 民间秘术——玄学杂术诸法