/** * 認證信息.(身份驗證) : Authentication 是用來驗證用戶身份 * * @param token * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken authcToken) throws AuthenticationException { System.out.println("身份認證方法:MyShiroRealm.doGetAuthenticationInfo()"); UsernamePasswordToken token = (UsernamePasswordToken) authcToken; String name = token.getUsername(); String password = String.valueOf(token.getPassword()); //訪問一次,計數一次 ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue(); opsForValue.increment(SHIRO_LOGIN_COUNT+name, 1); //計數大於5時,設置用戶被鎖定一小時 if(Integer.parseInt(opsForValue.get(SHIRO_LOGIN_COUNT+name))>=5){ opsForValue.set(SHIRO_IS_LOCK+name, "LOCK"); stringRedisTemplate.expire(SHIRO_IS_LOCK+name, 1, TimeUnit.HOURS); } if ("LOCK".equals(opsForValue.get(SHIRO_IS_LOCK+name))){ throw new DisabledAccountException("由於密碼輸入錯誤次數大於5次,帳號已經禁止登錄!"); } Map<String, Object> map = new HashMap<String, Object>(); map.put("nickname", name); //密碼進行加密處理 明文為 password+name String paw = password+name; String pawDES = MyDES.encryptBasedDes(paw); map.put("pswd", pawDES); SysUser user = null; // 從數據庫獲取對應用戶名密碼的用戶 List<SysUser> userList = sysUserService.selectByMap(map); if(userList.size()!=0){ user = userList.get(0); } if (null == user) { throw new AccountException("帳號或密碼不正確!"); }else if(user.getStatus()==0){ /** * 如果用戶的status為禁用。那么就拋出<code>DisabledAccountException</code> */ throw new DisabledAccountException("此帳號已經設置為禁止登錄!"); }else{ //登錄成功 //更新登錄時間 last login time user.setLastLoginTime(new Date()); sysUserService.updateById(user); //清空登錄計數 opsForValue.set(SHIRO_LOGIN_COUNT+name, "0"); } return new SimpleAuthenticationInfo(user, password, getName()); } 原文:https://blog.csdn.net/qq_20954959/article/details/61927119