|  | @ -3,6 +3,8 @@ package com.yihu.jw.security.core.userdetails.jdbc;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.core.userdetails.SaltUser;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.model.WlyyUserDetails;
 | 
	
		
			
				|  |  | import com.yihu.jw.security.model.WlyyUserSimple;
 | 
	
		
			
				|  |  | import org.apache.commons.lang.StringUtils;
 | 
	
		
			
				|  |  | import org.apache.commons.lang.time.DateUtils;
 | 
	
		
			
				|  |  | import org.springframework.jdbc.core.BeanPropertyRowMapper;
 | 
	
		
			
				|  |  | import org.springframework.jdbc.core.support.JdbcDaoSupport;
 | 
	
		
			
				|  |  | import org.springframework.security.core.GrantedAuthority;
 | 
	
	
		
			
				|  | @ -54,13 +56,29 @@ 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))) {
 | 
	
		
			
				|  |  |                 this.getJdbcTemplate().update("update base_user u set login_failure_count = 0, u.locked = 0 where u.username = ? or u.mobile = ? or u.idcard = ?", username, username, username);
 | 
	
		
			
				|  |  |                 //解除锁定
 | 
	
		
			
				|  |  |                 unlocked(username);
 | 
	
		
			
				|  |  |                 users.get(0).setLocked(false);
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return new SaltUser(username, users.get(0).getPassword(), users.get(0).getSalt(), users.get(0).isEnabled(), users.get(0).isLocked(), getGrantedAuthorities(username));
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public void unlocked(String username){
 | 
	
		
			
				|  |  |         String loginType = getLogintype();
 | 
	
		
			
				|  |  |         if(StringUtils.isBlank(loginType)||"1".equals(loginType)){ //1或默认查找user表,为平台管理员账号
 | 
	
		
			
				|  |  |             //解除锁定
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_user u set login_failure_count = 0, u.locked = 0 where u.username = ? or u.mobile = ? or u.idcard = ?", username, username, username);
 | 
	
		
			
				|  |  |         }else if("2".equals(loginType)){//2.为医生账号
 | 
	
		
			
				|  |  |             //解除锁定
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_doctor d set d.login_failure_count = 0, d.locked = 0 where d.mobile = ? or d.idcard = ?",username, username);
 | 
	
		
			
				|  |  |         }else if("3".equals(loginType)){ //3.患者账号
 | 
	
		
			
				|  |  |             //解除锁定
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = 5, p.locked = 0 where p.mobile = ? or p.idcard = ?",username, username);
 | 
	
		
			
				|  |  |         } //...
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 用户登录判读接口
 | 
	
		
			
				|  |  |      * 判断loginType查找用户信息
 | 
	
	
		
			
				|  | @ -86,12 +104,6 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
 | 
	
		
			
				|  |  |         return users;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private Collection<? extends GrantedAuthority> getGrantedAuthorities(String username) {
 | 
	
		
			
				|  |  |         Collection<GrantedAuthority> authorities = new ArrayList<>(1);
 | 
	
		
			
				|  |  |         authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
 | 
	
		
			
				|  |  |         return authorities;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 设置用户登录时间,返回登录信息
 | 
	
		
			
				|  |  |      * 判断loginType,用户类型 1或默认为user,2:医生登录,3:患者登录
 | 
	
	
		
			
				|  | @ -112,17 +124,72 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
 | 
	
		
			
				|  |  |         //获取失败次数
 | 
	
		
			
				|  |  |         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
 | 
	
		
			
				|  |  |         String username = request.getParameter("username");
 | 
	
		
			
				|  |  |         Integer loginFailureCount = this.getJdbcTemplate().queryForObject("select login_failure_count from base_user u where u.username = ? or u.mobile = ? or u.idcard = ?", Integer.class, username, username, username);
 | 
	
		
			
				|  |  |         Integer loginFailureCount = getLoginFailureCount(username);
 | 
	
		
			
				|  |  |         loginFailureCount ++;
 | 
	
		
			
				|  |  |         if (loginFailureCount == 5) {
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_user u set u.login_failure_count = 5, locked = 1, u.locked_date = ? where u.username = ? or u.mobile = ? or u.idcard = ?", new Date(), username, username, username);
 | 
	
		
			
				|  |  |         if (loginFailureCount >= 5) {
 | 
	
		
			
				|  |  |             locked(username);
 | 
	
		
			
				|  |  |             return "账号已被锁定,请5分钟后重试!";
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             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);
 | 
	
		
			
				|  |  |             addFailureCount(username,loginFailureCount);
 | 
	
		
			
				|  |  |             return "密码错误,还可以再试" + (5 - loginFailureCount) + "次!";
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 获取失败次数
 | 
	
		
			
				|  |  |      * @param username
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public Integer getLoginFailureCount(String username){
 | 
	
		
			
				|  |  |         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);
 | 
	
		
			
				|  |  |         }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);
 | 
	
		
			
				|  |  |         }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;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 锁定账号
 | 
	
		
			
				|  |  |      * @param username
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public void locked(String username){
 | 
	
		
			
				|  |  |         String loginType = getLogintype();
 | 
	
		
			
				|  |  |         if(StringUtils.isBlank(loginType)||"1".equals(loginType)){ //1或默认查找user表,为平台管理员账号
 | 
	
		
			
				|  |  |             //账号锁定
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_user u set u.login_failure_count = 5, u.locked = 1, u.locked_date = ? where u.username = ? or u.mobile = ? or u.idcard = ?", new Date(), username, username, username);
 | 
	
		
			
				|  |  |         }else if("2".equals(loginType)){//2.为医生账号
 | 
	
		
			
				|  |  |             //账号锁定
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_doctor d set d.login_failure_count = 5, d.locked = 1, d.locked_date = ? where d.mobile = ? or d.idcard = ?", new Date(), username, username);
 | 
	
		
			
				|  |  |         }else if("3".equals(loginType)){ //3.患者账号
 | 
	
		
			
				|  |  |             //账号锁定
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = 5, p.locked = 1, p.locked_date = ?  where p.mobile = ? or p.idcard = ?", new Date(), username, username);
 | 
	
		
			
				|  |  |         } //...
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 更新失败次数
 | 
	
		
			
				|  |  |      * @param username
 | 
	
		
			
				|  |  |      * @param loginFailureCount
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public void addFailureCount(String username,Integer loginFailureCount){
 | 
	
		
			
				|  |  |         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);
 | 
	
		
			
				|  |  |         }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);
 | 
	
		
			
				|  |  |         }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);
 | 
	
		
			
				|  |  |         } //...
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private Collection<? extends GrantedAuthority> getGrantedAuthorities(String username) {
 | 
	
		
			
				|  |  |         Collection<GrantedAuthority> authorities = new ArrayList<>(1);
 | 
	
		
			
				|  |  |         authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
 | 
	
	
		
			
				|  | @ -149,7 +216,7 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
 | 
	
		
			
				|  |  |             //2.为医生登录账号
 | 
	
		
			
				|  |  |         }else if("2".equals(loginType)){
 | 
	
		
			
				|  |  |             //更新登录时间
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_doctor d set set d.login_failure_count = 0, d.login_date = ? where d.mobile = ? or d.idcard = ?", new Date(), username, username);
 | 
	
		
			
				|  |  |             this.getJdbcTemplate().update("update base_doctor d set d.login_failure_count = 0, d.login_date = ? where d.mobile = ? or d.idcard = ?", new Date(), username, username);
 | 
	
		
			
				|  |  |             users = this.getJdbcTemplate().query(DEFAULT_DOCTOR_DETAILS_STATEMENT, new BeanPropertyRowMapper(WlyyUserSimple.class), username, username);
 | 
	
		
			
				|  |  |             //3.患者登录
 | 
	
		
			
				|  |  |         }else if("3".equals(loginType)){
 | 
	
	
		
			
				|  | @ -169,7 +236,7 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         String loginType = request.getParameter("loginType");
 | 
	
		
			
				|  |  |         String loginType = request.getParameter("login_type");
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         return loginType;
 | 
	
		
			
				|  |  |     }
 |