第八章限制密码重试次数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次
推荐阅读
-
-
全职妈妈■“不上班的女人,才是最累的”全职妈妈的一条朋友圈,戳中泪点
-
“网红减肥药”骗局被曝光!含有多种禁药,已致26岁女生死亡
-
-
-
-
「触摸屏与OLED网」SE 平价款智能型手机改回 Touch ID 设计利好业成和TPK,iPhone
-
日本新干线 周末需要提前订票吗会不会人很多 买不到票
-
三点论史|日韩局势再度加剧!半导体之后日本又要出手了!网友:喜闻乐见!
-
晴天聊故事|中国“重量级”的省份,有11个国际机场,不是广东省
-
50岁以后的女人,还需要男人陪么?过来人的回答,让你想不到
-
李亚鹏|李亚鹏一家三口逛超市,女儿多次出镜,有意成为短视频小主角
-
[狂言体育]皇马5:1大胜进4强 巴萨之后马竞毕尔巴鄂均遭淘汰,线上西甲
-
智能穿戴2020双十一儿童手表选购指南,从低端到高端大品牌全价位覆盖
-
刘某|醉酒乘客无法说明目的地,被司机“遗弃”后死亡,法院这样判…
-
电竞小肥仔|LOL官推票选S赛名场面十六强,TS剑魔天神下凡一锤四仅排第四!
-
-
《三大队》结局初显:3个惊喜4个遗憾,赵明甫、六子结局意难平
-
「美国」截至5月5日下午5点,世卫要求美停止索赔污蔑中方!不服就拿出质疑证据
-
小刘聊汽车谁是你的菜?,11万起这几款各有优势的合资SUV即将入华