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

0abe56340fb7477098316c99720969e5.png

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

一、基础知识回顾

要实现多次登录失败账户锁定的功能,我们需要先回顾一下基础知识:

  • 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存储的版本,大家可以根据自己的应用情况选用。

        <dependency><groupId>es.moki.ratelimitj</groupId><artifactId>ratelimitj-inmemory</artifactId><version>0.4.1</version></dependency>

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

@Component
public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {@AutowiredUserDetailsManager userDetailsManager;//规则定义:1小时之内5次机会,就触发限流行为Set<RequestLimitRule> rules = Collections.singleton(RequestLimitRule.of(1 * 60, TimeUnit.MINUTES,5)); RequestRateLimiter limiter = new InMemorySlidingWindowRequestRateLimiter(rules);@Overridepublic 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 的定时器轮询,当然这是最差的方案。

期待您的关注

  • 向您推荐博主的系列文档:《手摸手教您学习SpringBoot系列-16章97节》
  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

变压器符号_行输出变压器的结构、符号及电路分析

行输出变压器又称逆程变压器、回扫变压器&#xff0c;俗称行输出&#xff0c;它是电视机、显示器中的一个重要变压器。1.行输出变压器结构行输出变压器的全部绕组和高压整流管均密封在其中&#xff0c;底部引出各个绕组的引脚&#xff0c;高压输出采用高压引线直接送至显像管的…

西南医院微服务咋查得到_#全国最好医院排行榜#发布:成都这4家牛了!四川31个专科排全国前十(总榜)...

病急不能乱投医&#xff01;近日&#xff0c;一年一度、令人期待的——复旦版《2018年度中国医院排行榜&#xff08;总榜&#xff09;》全新揭晓了~这份榜单不仅是是中国医院学科建设的一个标杆也是大众疑难杂症寻找好医院的重要参考四川4家医院入百强&#xff01;华西全国第二…

voxelnet_ue4商城资源Voxel Sandbox Toolkit体素沙盒工具箱

Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Voxel Sandbox Toolkit体素沙盒工具箱体素沙盒工具箱是一个新的改进版本的体素生成从2016年适应4.22的需要。它用不同类型的立方体、树和拾取网格生成无限世界。因为额外的代码实现比以前的版本快得多。理想的创…

Pub / Sub本地模拟器

发布/订阅是GCP提供的不错的工具。 它非常方便&#xff0c;可以帮助您解决应用程序可能面临的消息传递难题。 实际上&#xff0c;如果您使用GCP&#xff0c;则可以使用托管消息解决方案。 如预期的那样&#xff0c;使用实际的发布/订阅解决方案需要一定的配额&#xff0c;因此…

mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义

1&#xff0c;创建表时加入的约束a) 非空约束&#xff0c;not nullb) 唯一约束&#xff0c;uniquec) 主键约束&#xff0c;primary keyd) 外键约束&#xff0c;foreign key1&#xff0c;非空约束&#xff0c;针对某个字段设置其值不为空&#xff0c;如&#xff1a;学生的姓名不…

minecraft_MineCraft和堆外内存

minecraft总览 MineCraft是一个很好的例子&#xff0c;说明何时使用堆外内存确实可以提供帮助。 关键要求是&#xff1a; 保留的数据大部分是一个简单的数据结构&#xff08;在Minecraft的情况下&#xff0c;其很多字节[]&#xff09; 堆外内存的使用可以隐藏在抽象中。 考试…

win2008 mysql_mysql5.7.17在win2008R2的64位系统安装与配置实例

脚本之家已经给大家讲解过MYSQL其他版本在各种环境中的安装过程&#xff0c;大家可以参阅正文下面的相关文章&#xff0c;今天一起来学习下mysql5.7.17的实例安装教学&#xff0c;配置上稍微不同&#xff0c;希望能够帮助到你。安装MySql操作系统&#xff1a;Windows Server 20…

结构性错误

团队成员在使用以下代码时遇到了麻烦&#xff1a; void extractData(String targetUri) { Path tempFile createTempFilePath(); extractDataToPathAndUpload(tempFile, targetUri); cleanUp(tempFile); } void extractDataToPathAndUpload(Path tempFile, String targetUr…

mysql小计_使用SQL实现小计,合计以及排序_MySQL

bitsCN.com--说明&#xff1a;个人学习笔记&#xff0c;实现小计合计显示&#xff0c;分组按BANK_IDOP_DATE升序排序--测试数据CREATE TABLE #TB(ID VARCHAR(10),BANK_ID VARCHAR(10),OP_DATE VARCHAR(10),OPERATOR_NO VARCHAR(20),AMT DECIMAL(10,2))INSERT #TB SELECT 1111,0…

mule和activemq_Mule ESB,ActiveMQ和DLQ

mule和activemq在本文中&#xff0c;我将展示一个简单的Mule ESB流程&#xff0c;以了解实际中使用的Active MQ 的DLQ功能 。 我假设您有一个正在运行的Apache ActiveMQ实例&#xff08;如果没有&#xff0c;则可以在此处下载一个版本&#xff09;。 在此示例中&#xff0c;我…

MySQL倒序如何避免filesort_如何避免mysql查询的filesort?

我用不同的参数使用这种查询&#xff1a;EXPLAIN SELECT SQL_NO_CACHE ilan_genel.id , ilan_genel.durum , ilan_genel.kategori , ilan_genel.tip , ilan_genel.ozellik , ilan_genel.m2 , ilan_genel.fiyat , ilan_genel.baslik , ilan_genel.ilce , ilan_genel.parabirimi …

在Java中键入Safe SQL

字符串&#xff0c;字符串&#xff0c;字符串 无论您使用的是JPA &#xff0c; MyBatis还是Spring Data JDBC之类的框架&#xff0c;最终都将SQL语句声明为Java String。 这种方法的问题在于&#xff0c;您必须为每个语句编写测试&#xff0c;以确保它甚至是有效的SQL。 没有编…

springmvc怎么设置更改了界面不用重启_Microsoft Visual Studio 2019 更改语言包

第一次写文章&#xff0c;如有格式等问题&#xff0c;请多多包含与指点&#xff01;很多人在编程时更喜欢英文界面&#xff0c;认为与编程语言具有相同的语境&#xff0c;更顺手。但是&#xff0c;在更改环境显示语言时&#xff0c;可能会遇到一些障碍&#xff0c;例如我之前在…

苹果电脑怎么删除软件_误格式化,删除文件怎么恢复?3款最好用的数据恢复软件推荐...

1、EasyRecovery一款威力非常强大的硬盘数据恢复工具&#xff0c;能够恢复丢失的数据以及重建文件系统。主要体现在可以从被病毒破坏或是已经格式化的硬盘中恢复数据。EasyRecovery在使用过程中不会在原始的驱动器中写入任何东西&#xff0c;其主要是在内存中重建文件分区表使数…

设计模式 生成器_生成器设计模式的应用

设计模式 生成器嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将分享我制作的全新设计模式系列的第一个。 构建器设计模式是开发严肃的应用程序时非常有用且通用的模式。 在这篇文章中&#xff0c;我将提供一个很小的构建器模式框架&#xff0c;因此您随时可以回到这里并…

C++ Qt全局异常处理器_QT教程

点击上方 蓝字关注我们今日资源今天的资源是另一套QT教程&#xff0c;某马发的&#xff0c;网上搜集到的。这已经是这个公众号发放的第三套QT教程了。关于QT&#xff1a;Qt(官方发音 [kju:t]&#xff0c;音同 cute)是一个跨平台的 C 开发库&#xff0c;主要用来开发图形用户界面…

无线设置 用户_无线WiFi远距离无线蹭网怎么中继桥接组网【详细介绍】

自从小编每天分享各种各样的无线无线WiFi蹭网、桥接、远距离组网等实例&#xff0c;吸引了很多朋友的兴趣&#xff0c;有很多网友通过关心我后&#xff0c;给我私信&#xff0c;求助我一些相关的问题&#xff0c;还有一些朋友建议我出一些教程。首先小编觉得有些东西只能意会不…

应用宝苹果版_点赞应用ios版下载-点赞应用苹果版下载v1.1

《点赞应用》app是一款实用的视频生成器工具&#xff0c;用户可以利用它为自己的视频添加各种各样的点赞效果。应用内含有多种类型的模板&#xff0c;都是免费使用的&#xff0c;想要将你的视频变得更有趣吗&#xff1f;快来下载体验一下这款应用吧&#xff01;软件特色1、这个…

SQL即服务

自2007年以来&#xff0c;我一直在考虑这一点&#xff0c;大约在Amazon 推出 S3时。 我什至尝试实现了几次&#xff0c;但是在设计阶段之后就失败了。 我听说过一家初创公司&#xff0c;也曾尝试这样做&#xff0c;但也失败了 。 我仍然不确定是否可以这样做&#xff0c;但是它…

c++ vector 一部分_《JACS》:在富电子C-H键位点上实现光控活性聚合

可逆加成-断裂链转移(RAFT)自由基活性聚合是一种调控聚合物结构组成、分子量和分布的重要聚合方法&#xff0c;其中&#xff0c;光诱导电子/能量转移(PET)的RAFT聚合反应是一种更精确的调控手段&#xff0c;因而经常被用于设计具有复杂3D分子结构的聚合物。然而常规的PET-RAFT法…