|  | @ -6,6 +6,7 @@ import com.yihu.jw.security.model.WlyyUserSimple;
 | 
	
		
			
				|  |  | import org.apache.commons.lang.StringUtils;
 | 
	
		
			
				|  |  | import org.apache.commons.lang.time.DateUtils;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Value;
 | 
	
		
			
				|  |  | import org.springframework.data.redis.core.StringRedisTemplate;
 | 
	
		
			
				|  |  | import org.springframework.jdbc.core.BeanPropertyRowMapper;
 | 
	
		
			
				|  |  | import org.springframework.jdbc.core.support.JdbcDaoSupport;
 | 
	
	
		
			
				|  | @ -20,6 +21,7 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import javax.servlet.http.HttpServletRequest;
 | 
	
		
			
				|  |  | import javax.sql.DataSource;
 | 
	
		
			
				|  |  | import java.sql.Timestamp;
 | 
	
		
			
				|  |  | import java.util.*;
 | 
	
		
			
				|  |  | import java.util.concurrent.TimeUnit;
 | 
	
		
			
				|  |  | 
 | 
	
	
		
			
				|  | @ -39,6 +41,12 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private StringRedisTemplate redisTemplate;
 | 
	
		
			
				|  |  |     @Value("${user.autoUnlockTime}")
 | 
	
		
			
				|  |  |     private Integer autoUnlockTime;//自动解锁时间 以分钟计算
 | 
	
		
			
				|  |  |     @Value("${user.reflashFailedCountTime}")
 | 
	
		
			
				|  |  |     private Integer reflashFailedCountTime;//将失败次数重置为0 ,以分钟计算
 | 
	
		
			
				|  |  |     @Value("${user.tryLoginTimes}")
 | 
	
		
			
				|  |  |     private Integer tryLoginTimes;//失败重试次数
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public WlyyUserDetailsService(DataSource dataSource) {
 | 
	
		
			
				|  |  |         this.setDataSource(dataSource);
 | 
	
	
		
			
				|  | @ -60,7 +68,7 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         if (users.get(0).isLocked()) {
 | 
	
		
			
				|  |  |             Date date = users.get(0).getLockedDate();
 | 
	
		
			
				|  |  |             if (new Date().after(DateUtils.addMinutes(date, 5))) {
 | 
	
		
			
				|  |  |             if (new Date().after(DateUtils.addMinutes(date, autoUnlockTime))) {
 | 
	
		
			
				|  |  |                 //解除锁定
 | 
	
		
			
				|  |  |                 unlocked(username);
 | 
	
		
			
				|  |  |                 users.get(0).setLocked(false);
 | 
	
	
		
			
				|  | @ -137,33 +145,48 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
 | 
	
		
			
				|  |  |         //获取失败次数
 | 
	
		
			
				|  |  |         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
 | 
	
		
			
				|  |  |         String username = request.getParameter("username");
 | 
	
		
			
				|  |  |         Integer loginFailureCount = getLoginFailureCount(username);
 | 
	
		
			
				|  |  |         Map<String,Object> map = getLoginFailureCount(username);
 | 
	
		
			
				|  |  |         Integer loginFailureCount = Integer.valueOf(map.get("login_failure_count").toString());
 | 
	
		
			
				|  |  |         Object timeObj = map.get("last_login_failure_time");
 | 
	
		
			
				|  |  |         if(timeObj == null){
 | 
	
		
			
				|  |  |             loginFailureCount = 0;
 | 
	
		
			
				|  |  |         }else{
 | 
	
		
			
				|  |  |             Timestamp timestamp = (Timestamp) timeObj;
 | 
	
		
			
				|  |  |             //判断是否得重置登陆次数
 | 
	
		
			
				|  |  |             Date date = new Date(timestamp.getTime());
 | 
	
		
			
				|  |  |             if (new Date().after(DateUtils.addMinutes(date, reflashFailedCountTime))) {
 | 
	
		
			
				|  |  |                 //重置登陆次数
 | 
	
		
			
				|  |  |                 loginFailureCount = 0;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         loginFailureCount ++;
 | 
	
		
			
				|  |  |         if (loginFailureCount >= 5) {
 | 
	
		
			
				|  |  |         if (loginFailureCount >= tryLoginTimes) {
 | 
	
		
			
				|  |  |             locked(username);
 | 
	
		
			
				|  |  |             return "账号已被锁定,请5分钟后重试!";
 | 
	
		
			
				|  |  |             return "账号已被锁定,请"+autoUnlockTime+"分钟后重试!";
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             addFailureCount(username,loginFailureCount);
 | 
	
		
			
				|  |  |             return "账号或密码错误,还可以再试" + (5 - loginFailureCount) + "次!";
 | 
	
		
			
				|  |  |             return "账号或密码错误,还可以再试" + (tryLoginTimes - loginFailureCount) + "次!";
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 获取失败次数
 | 
	
		
			
				|  |  |      * 获取失败次数 返回 map  key1: login_failure_count   失败次数
 | 
	
		
			
				|  |  |      *                       key2: last_login_failure_time 上次登录失败时间 /可能为null
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param username
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public Integer getLoginFailureCount(String username){
 | 
	
		
			
				|  |  |     public Map<String, Object> getLoginFailureCount(String username){
 | 
	
		
			
				|  |  |         Map<String, Object> result = new HashMap<>();
 | 
	
		
			
				|  |  |         String loginType = getLogintype();
 | 
	
		
			
				|  |  |         Integer loginFailureCount = 0;
 | 
	
		
			
				|  |  |         if(StringUtils.isBlank(loginType)||"1".equals(loginType)){ //1或默认查找user表,为平台管理员账号
 | 
	
		
			
				|  |  |             loginFailureCount = this.getJdbcTemplate().queryForObject("select u.login_failure_count from base_user u where u.username = ? or u.mobile = ? or u.idcard = ?", Integer.class, username, username, username);
 | 
	
		
			
				|  |  |             result = this.getJdbcTemplate().queryForMap("select u.login_failure_count,u.last_login_failure_time from base_user u where u.username = ? or u.mobile = ? or u.idcard = ?", username, username, username);
 | 
	
		
			
				|  |  |         }else if("2".equals(loginType)){//2.为医生账号
 | 
	
		
			
				|  |  |             loginFailureCount = this.getJdbcTemplate().queryForObject("select d.login_failure_count from base_doctor d where d.mobile = ? or d.idcard = ?", Integer.class, username, username);
 | 
	
		
			
				|  |  |             result = this.getJdbcTemplate().queryForMap("select d.login_failure_count,d.last_login_failure_time from base_doctor d where d.mobile = ? or d.idcard = ?", username, username);
 | 
	
		
			
				|  |  |         }else if("3".equals(loginType)){ //3.患者账号
 | 
	
		
			
				|  |  |             loginFailureCount = this.getJdbcTemplate().queryForObject("select p.login_failure_count from base_patient p where p.mobile = ? or p.idcard = ?", Integer.class, username, username);
 | 
	
		
			
				|  |  |         } //...
 | 
	
		
			
				|  |  |         return loginFailureCount;
 | 
	
		
			
				|  |  |             result = this.getJdbcTemplate().queryForMap("select p.login_failure_count,p.last_login_failure_time from base_patient p where p.mobile = ? or p.idcard = ?",username, username);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return result;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
	
		
			
				|  | @ -193,13 +216,13 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
 | 
	
		
			
				|  |  |         String loginType = getLogintype();
 | 
	
		
			
				|  |  |         if(StringUtils.isBlank(loginType)||"1".equals(loginType)){ //1或默认查找user表,为平台管理员账号
 | 
	
		
			
				|  |  |             //更新失败次数
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_user u set u.login_failure_count = ? where u.username = ? or u.mobile = ? or u.idcard = ?", loginFailureCount, username, username, username);
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_user u set u.login_failure_count = ? ,u.last_login_failure_time = ? where u.username = ? or u.mobile = ? or u.idcard = ?", loginFailureCount,new Date(), username, username, username);
 | 
	
		
			
				|  |  |         }else if("2".equals(loginType)){//2.为医生账号
 | 
	
		
			
				|  |  |             //更新失败次数
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_doctor d set d.login_failure_count = ? where d.mobile = ? or d.idcard = ?", loginFailureCount, username, username);
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_doctor d set d.login_failure_count = ?, d.last_login_failure_time = ?  where d.mobile = ? or d.idcard = ?", loginFailureCount,new Date(), username, username);
 | 
	
		
			
				|  |  |         }else if("3".equals(loginType)){ //3.患者账号
 | 
	
		
			
				|  |  |             //更新失败次数
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = ? where p.mobile = ? or p.idcard = ?", loginFailureCount, username, username);
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = ? ,p.last_login_failure_time = ? where p.mobile = ? or p.idcard = ?", loginFailureCount,new Date(),username, username);
 | 
	
		
			
				|  |  |         } //...
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 |