| 
					
				 | 
			
			
				@ -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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 |