第八章限制密码重试次数1、实现原理保证原子性:
单系统:AtomicLong计数
?集群系统:RedissionClient提供的RAtomicLong计数
1、获取系统中是否已有登录次数缓存,缓存对象结构预期为:"用户名--登录次数" 。 2、如果之前没有登录缓存 , 则创建一个登录次数缓存 。 3、如果缓存次数已经超过限制 , 则驳回本次登录请求 。 4、将缓存记录的登录次数加1,设置指定时间内有效5、验证用户本次输入的帐号密码 , 如果登录登录成功 , 则清除掉登录次数的缓存思路有了 , 那我们在哪里实现呢?我们知道AuthenticatingRealm里有比较密码的入口doCredentialsMatch方法
packagecom.itheima.shiro.core.impl;importcom.itheima.shiro.constant.CacheConstant;importcom.itheima.shiro.constant.SuperConstant;importcom.itheima.shiro.core.SimpleCacheManager;importcom.itheima.shiro.core.base.ShiroUser;importcom.itheima.shiro.core.base.SimpleToken;importcom.itheima.shiro.core.ShiroDbRealm;importcom.itheima.shiro.core.bridge.UserBridgeService;importcom.itheima.shiro.pojo.User;importcom.itheima.shiro.utils.*;importorg.apache.shiro.authc.AuthenticationInfo;importorg.apache.shiro.authc.AuthenticationToken;importorg.apache.shiro.authc.SimpleAuthenticationInfo;importorg.apache.shiro.authc.UnknownAccountException;importorg.apache.shiro.authc.credential.HashedCredentialsMatcher;importorg.apache.shiro.authz.AuthorizationInfo;importorg.apache.shiro.subject.PrincipalCollection;importorg.apache.shiro.util.ByteSource;importorg.redisson.api.RedissonClient;importorg.springframework.beans.factory.annotation.Autowired;importjavax.annotation.Resource;/***@Description:自定义shiro的实现*/publicclassShiroDbRealmImplextendsShiroDbRealm{@AutowiredprivateUserBridgeServiceuserBridgeService;@AutowiredprivateSimpleCacheManagersimpleCacheManager;@Resource(name="redissonClientForShiro")privateRedissonClientredissonClient;/***@Description认证方法*@paramauthcToken校验传入令牌*@returnAuthenticationInfo*/@OverridepublicAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokenauthcToken){SimpleTokentoken=(SimpleToken)authcToken;Useruser=userBridgeService.findUserByLoginName(token.getUsername());if(EmptyUtil.isNullOrEmpty(user)){thrownewUnknownAccountException("账号不存在");}ShiroUsershiroUser=BeanConv.toBean(user,ShiroUser.class);StringsessionId=ShiroUserUtil.getShiroSessionId();StringcacheKeyResourcesIds=CacheConstant.RESOURCES_KEY_IDS+sessionId;shiroUser.setResourceIds(userBridgeService.findResourcesIdsList(cacheKeyResourcesIds,user.getId()));Stringsalt=user.getSalt();Stringpassword=user.getPassWord();returnnewSimpleAuthenticationInfo(shiroUser,password,ByteSource.Util.bytes(salt),getName());}/***@Description授权方法*@paramprincipalsSimpleAuthenticationInfo对象第一个参数*@return*/@OverridepublicAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){ShiroUsershiroUser=(ShiroUser)principals.getPrimaryPrincipal();returnuserBridgeService.getAuthorizationInfo(shiroUser);}/***@Description清理缓存*/@OverridepublicvoiddoClearCache(PrincipalCollectionprincipalcollection){StringsessionId=ShiroUtil.getShiroSessionId();simpleCacheManager.removeCache(CacheConstant.ROLE_KEY+sessionId);simpleCacheManager.removeCache(CacheConstant.RESOURCES_KEY+sessionId);simpleCacheManager.removeCache(CacheConstant.TOKEN+sessionId);}/***@Description加密方式*/@OverridepublicvoidinitCredentialsMatcher(){RetryLimitCredentialsMatchermatcher=newRetryLimitCredentialsMatcher(SuperConstant.HASH_ALGORITHM,redissonClient);matcher.setHashIterations(SuperConstant.HASH_INTERATIONS);setCredentialsMatcher(matcher);}}3、测试访问 , 使用admin账号输入错误密码5次
推荐阅读
-
手术|女主播花2万多做隆鼻修复术,整完鼻子变4个洞……
-
热血传奇:热血传奇:小虾米在当初竟遭到全服玩家追杀,他当初到底做了什么
-
北京天安门广场|游客为雨中哨兵撑伞,让人泪目的一刻发生了
-
郭施亮|外资大举买入,A股步入加速上涨行情了吗?,两天大涨超百点
-
教育部|教育部规范大学命名,宁波大学、厦门大学、复旦大学简称要说好
-
|椰树招聘,网友破口大骂:卖身契都出来了,不是你疯就是我疯
-
-
#司机师傅#避免司机买车被“坑”滴滴暂停新司机注册审核7天
-
#吴昕祝福潘玮柏#吴昕祝福潘玮柏结婚真好 好友周杰伦为好兄弟留言
-
-
-
虎扑足球|拜仁全队总身价是莫斯科火车头10倍,对比悬殊
-
-
-
[长安汽车]本田享域:终于靠价格扳回一局,车长近4.8米轴距2730mm,跌破8万
-
老鹰航空|俄罗斯远程客机技术在曲折中成熟,却输掉市场,从图-114到伊尔96
-
味谷的厨房原创 夏天吃烤生蚝,料汁是关键,多数人做错,跟着做新手秒变大厨
-
大宇茶馆|为何却被称为三国战力天花板?,死于吕布之手的都是小虾小鱼
-
北京日报客户端世卫组织:中国以外确诊病例突破401万例
-
4am战队|PCL:虎牙双雄相继崛起,4AM更是完成一个纪录,网友直呼不可思议