第八章限制密码重试次数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次
推荐阅读
-
-
-
钓友:黑坑鱼多就好钓?不一定,没掌握好这些技巧很难说
-
-
加热包可以二次使用吗 自热火锅的加热包可以二次使用吗
-
ZAKER生活|病毒“醒”了,美国民众却还沉浸在狂欢中,全美36州疫情严重反弹
-
「4am战队」黄金大奖赛S9小组赛:4AM小鹿肠胃不适缺阵,98吃到加盟SMG后第一只鸡!
-
「科技依依酱」3 3300X/3100看似差不多,但其核心构造却完全不同,注意!Ryzen
-
放毒|售价仅299美元,进军千元机市场?苹果或推出下一代低价手机
-
-
边境上的乡镇邮递员 金仁哲:30年 骑行近37万公里
-
科学家▲科学家终于找到“第二地球”,和地球十分相似,距离也很近!
-
正义励志小雷|仍然是路,只要你愿意走,早安心语:路的尽头
-
富贵籽的养殖方法和注意事项盆栽 富贵籽正确养殖方法和注意事项
-
「周末综艺指南」“短带长”策略初显效,字节跳动能打造“中国YouTube”吗?
-
伦敦暴力事件后,特朗普称伦敦市长是个“灾难”得尽快换人
-
-
北晚新视觉网|医院称需双方签字,法院这样判,女子丧偶后欲用冷冻胚胎遭拒
-
老孙科技三星打脸,明年也要取消充电器?国产手机会跟随吗?百瓦快充时代的纠结“友商”的默契和下游产业链的春天?
-
大洋网国际|还要买俄军装备,你来制裁啊!土耳其总统强硬回击美国警告