shiro学习笔记:remeberMe,多次登录锁死账号
关于shiro的rememberme的实现,再之前我们是使用cookie实现的,这里也是一样,原理都是相同的;
不过因为用到了shiro框架,因此需要再shiro中配置cookie以及缓存等,以及管理器对象:
<!--安全管理器--><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!--缓存管理器--><property name="cacheManager" ref="cacheManager"/><!--会话的模式--><property name="sessionMode" value="native"/><!--配置realm--><property name="realms" ref="myRealm"/><property name="rememberMeManager" ref="rememberMeManager"/></bean><!--cookie对象--><bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie"><constructor-arg value="rememberMe"/><!--只有http的连接才使用cookie--><property name="httpOnly" value="true"/><!--cookie失效时间--><property name="maxAge" value="#{60*60*24}"/></bean><!--记住我管理器对象--><bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager"><property name="cookie" ref="simpleCookie"/></bean>
控制器:
@Controller public class UserController {private static final transient Logger log = LoggerFactory.getLogger(UserController.class);@RequestMapping("/login")public String login(User user,String rememberMe) throws Exception {Subject currentUser = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());//记住我if (rememberMe != null &&rememberMe.equals("1")) {token.setRememberMe(true);}currentUser.login(token);return "redirect:/home";} }
前端页面:
<form action="../login" method="post"><input type="text" name="username"><input type="password" name="password"><input type="checkbox" name="rememberMe" value="1">记住我<input type="submit"> </form>
配置完成后,再shiro配置文件中对路径进行配置:
表示emp/下的请求,用户可以访问,然后运行tomcat,输入表单信息,记住我,然后登录,登录成功后,关闭浏览器,关闭浏览器的同时,关闭了session,但是cookie中存有数据,因此可以直接访问/emp/**下的资源,亲测:火狐浏览器如果出不来效果,可能是设置的问题,火狐浏览器,关闭浏览器时自动清空缓存,需要关闭:
多次登录锁死账号
多次登录锁死账号:根据这个功能的名称,我们可以构思,我们要将登录信息放在哪儿?如果放在cookie中,每次登录就会刷新登录数据,没有办法记录登录的次数,可以缓存来记录登录次数。具体操作:
1.配置缓存:
<?xml version="1.0" encoding="UTF-8"?> <ehcache name="es"><diskStore path="java.io.tmpdir"/><!--maxEntriesLocalHeap:是用来限制当前缓存在堆内存上所能保存的最大元素数量eternal:false 设定缓存的elemen是否永远不过期timeToLiveSeconds:对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值为0,表示一直可以访问。(单位:秒)timeToIdleSeconds:对象空闲时,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值为0。(单位:秒)--><!-- 默认缓存 --><defaultCachemaxEntriesLocalHeap="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"maxEntriesLocalDisk="10000000"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"/><!-- 登录记录缓存 锁定10分钟 --><cache name="passwordRetryCache"maxEntriesLocalHeap="2000"eternal="false"timeToIdleSeconds="360"timeToLiveSeconds="360"overflowToDisk="false"statistics="true"></cache><cache name="authorizationCache"maxEntriesLocalHeap="2000"eternal="false"timeToIdleSeconds="3600"timeToLiveSeconds="0"overflowToDisk="false"statistics="true"></cache><cache name="authenticationCache"maxEntriesLocalHeap="2000"eternal="false"timeToIdleSeconds="3600"timeToLiveSeconds="0"overflowToDisk="false"statistics="true"></cache><cache name="shiro-activeSessionCache"maxEntriesLocalHeap="2000"eternal="false"timeToIdleSeconds="3600"timeToLiveSeconds="0"overflowToDisk="false"statistics="true"></cache></ehcache>
ehcache.xml
2.在shiro配置文件中,配置缓存的路径:
3.自定义凭证匹配器,引入缓存
package com.zs.credentials;import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.ExcessiveAttemptsException; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheManager;import java.util.concurrent.atomic.AtomicInteger;public class MyMatcher extends HashedCredentialsMatcher {//Map:key,value//key:存用户名 value:次数private Cache<String, AtomicInteger> passwordCache;public MyMatcher(CacheManager cacheManager) {this.passwordCache = cacheManager.getCache("passwordRetryCache");}//密码匹配 @Overridepublic boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {//获取用户名String username= (String) token.getPrincipal();//先去缓存中查找是否有该信息AtomicInteger retryCount= passwordCache.get(username);//第一次是nullif(retryCount==null){//初始话:0retryCount=new AtomicInteger(0);//存入缓存中 passwordCache.put(username,retryCount);}//在retryCount上增加1,并获取该值if(retryCount.incrementAndGet()>3){throw new ExcessiveAttemptsException("该账号已锁定");}//密码匹配boolean matcher=super.doCredentialsMatch(token, info);//如果登录成功if(matcher){//清空缓存数据 passwordCache.remove(username);}return matcher;} }
自定义的凭证匹配器
配置该凭证匹配器,并引入缓存:
然后运行登录测试:输入三次错误密码,在登录,报异常账户锁死:
异常类:
package com.zs.controller;import com.zs.entity.Result; import org.apache.shiro.authc.AccountException; import org.apache.shiro.authc.ExcessiveAttemptsException; import org.apache.shiro.authc.IncorrectCredentialsException; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice public class ExceptionController {@ExceptionHandler(Exception.class)@ResponseBodypublic Result error(Exception ex, Model model) {Result result = new Result();if (ex instanceof AccountException) {if (ex instanceof ExcessiveAttemptsException) {result.setMessages("账户锁定");} else {result.setStats(501);result.setMessages("账号错误");}} else if (ex instanceof IncorrectCredentialsException) {result.setStats(502);result.setMessages("密码错误");} else {result.setStats(503);result.setMessages("数据错误");}return result;} }
View Code
运行结果:
转载于:https://www.cnblogs.com/Zs-book1/p/11354788.html
shiro学习笔记:remeberMe,多次登录锁死账号相关推荐
- Shiro学习笔记_02:shiro的认证+shiro的授权
Shiro 学习笔记 本文基于B站UP主[编程不良人]视频教程[2020最新版Shiro教程,整合SpringBoot项目实战教程]进行整理记录,仅用于个人学习交流使用. 视频链接:https://w ...
- Shiro学习笔记(三)源码解析
Shiro作为轻量级的权限框架,Shiro的认证流程是怎样的一个过程. 如果没有对Shiro进行了解的话,建议先对Shiro学习笔记(一)学习一下Shiro基本的组 成. 1,几大重要组件解析 1.1 ...
- 【CS学习笔记】17、登录验证的难点
0x00 前言 如果当前账号权限被系统认为是本地管理员权限,那么就可以执行很多管理员才能做的事,接下来就来看一下这样的一个过程是如何工作的,其中会涉及到以下要点: 1.Access Token 登录令 ...
- Shiro学习笔记四(Shiro集成WEB)
这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...
- shiro 学习笔记
1. 权限管理 1.1 什么是权限管理? 权限管理实现对用户访问系统的控制,按照安全规则或者安全策略,可以控制用户只能访问自己被授权的资源 权限管理包括用户身份认证和授权两部分,简称认证授权 1.2 ...
- Shiro学习笔记-----小组开发前后端分离项目---登陆认证盐值加密
当下我正在参与的学校前后端分离的实习项目,有了登录系统的需求,于是我在了解到Shiro是当下主流的安全框 架后,毅然决然开启了学习Shiro的旅程 首先来谈谈什么是Shiro,Apache Shiro ...
- shiro学习笔记(三)知识整合
参考 小D课堂 二当家小D老师的笔记 小滴课堂官网:https://xdclass.net/#/index 官网 第1章 Shiro权限实战课程介绍 第1集 Shiro权限实战课程介绍 简介:讲解为什 ...
- Shiro学习(15)单点登录
Shiro 1.2开始提供了Jasig CAS单点登录的支持,单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录.此处我们使用Ja ...
- [shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39933993 shiro官网: http://shiro.apache.org/ sh ...
最新文章
- 增加自增列 耗时长_又一批长事务,P0故障谁来背锅?
- 内核启动流程分析(四)源码浅析
- .团队组建及项目启动
- label smoothing(标签平滑)
- MapReduce源代码浅析
- 颠覆认知!完美赌徒,到底是如何用数学打造经济神话?!
- 浅谈iptables防SYN Flood攻击和CC攻击
- 同时生成 Release版和Debug版DLL的方法
- c语言16位字节只能用到255,《C语言程序设计》月考试题(第三章).doc
- afnetworking 和 asihttprequest 强制修改http连接的host地址
- QT designer 控件自适应
- 【JAVA】根据汉字拼音首字母排序 不同类型处理
- linux 指令熟悉
- od机考题目-机器人走迷宫
- Java 静态static
- 2022.02.09_Java学习总结_网络编程、正则表达式
- sublime显示当前文件的编码格式
- 接口自动化场景用例——对象嵌套对象
- 逻辑运算符符号化命题——数理逻辑
- Multi-Exemplar Affinity Propagation
热门文章
- imei模拟修改_悟空分身 — 支持位置模拟设备修改
- 比较三个数大小PHP代码,php 写程序求三个数的最大值
- 计算机表情识别技术研究学什么,表情识别的图像预处理和特征提取方法研究
- arm qt mysql插件_编译ARM平台的QtEmbedded的MySQL插件和移植MySQL
- springboot+aop切点记录请求和响应信息
- 桌面上的Flutter:Electron又多了个对手
- 关于nginx keep-alive 参数的验证和心得
- JDK/Java SE官方文档汇总
- Mybatis DAO接口为什么不需要实现类
- CentOS 6.3 源码编译安装Apache