package security.internal; import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; import org.apache.commons.lang3.ObjectUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.security.providers.encoding.PasswordEncoder; import com.google.common.collect.Sets; import kernel.bo.RecordObjectMapper; import kernel.exception.BusinessException; import kernel.util.StringUtils; import kernel.web.ApplicationUtil; import security.Resource; import security.Role; import security.SecUser; /** * @author JORGE * @description SecUser实体持久层操作 */ public class SecUserServiceImpl implements SecUserService { /** * 密码工具 */ private PasswordEncoder passwordEncoder; public void setPasswordEncoder(PasswordEncoder passwordEncoder) { this.passwordEncoder = passwordEncoder; } public void saveUser(SecUser user) { if(null==user) return; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); List uuids=jdbcTemplate.queryForList("SELECT UUID FROM SCT_USER WHERE USERNAME=?", String.class, user.getUsername()); if (ObjectUtils.isNotEmpty(uuids)) throw new BusinessException("系统存在相同[系统登录名]!"); user.setCreateTime(new Date()); if(null==user.getId()) user.setId(ApplicationUtil.getCurrentTimeUUID()); user.setPassword(passwordEncoder.encodePassword(user.getPassword(), user.getUsername())); ApplicationUtil.executeInsert(user); cascadeRole(user); } /** * 根据用户名删除用户 * 删除用户后,此删除的用户不再关联角色 * @param user 需要删除的用户 */ public void deleteUser(SecUser user) { if(null==user) return; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); String uuid=null; List uuids=jdbcTemplate.queryForList("SELECT UUID FROM SCT_USER WHERE USERNAME=?", String.class, user.getUsername()); if (ObjectUtils.isEmpty(uuids) || null==(uuid=uuids.get(0))) throw new BusinessException("系统用户登录名不存在!"); jdbcTemplate.update("DELETE FROM SCT_USER WHERE UUID=?",uuid); jdbcTemplate.update("DELETE FROM SCT_USER_ROLE WHERE USER_UUID=?",uuid); } /** * 根据用户名查找用户 * @param userName 用户名 * @return 用户信息(包含关联角色与权限) */ public SecUser findUserByLoginName(String userName) { if(ObjectUtils.isEmpty(userName)) return null; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); String userSql="SELECT * FROM SCT_USER WHERE USERNAME=?"; List users=jdbcTemplate.query(userSql, RecordObjectMapper.newInstance(SecUser.class), userName); SecUser user=null; if(null==users || users.isEmpty() || null==(user=users.get(0))) return null; return bindRoleResource(user); } /** * 根据邮箱查找用户 * @param userName 用户名 * @return 用户信息(包含关联角色与权限) */ public SecUser findUserByLoginName2(String emailPhone) { String userName = emailPhone; if(ObjectUtils.isEmpty(emailPhone)) return null; String sql = ""; if(isValidPhone(emailPhone)) { sql ="SELECT * FROM PAT_PARTY WHERE USERNAME=?"; }else if(isValidEmail(emailPhone)) { sql="SELECT * FROM PAT_PARTY WHERE USERNAME=?"; } JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); if(ObjectUtils.isNotEmpty(sql)) { List userList=jdbcTemplate.query(sql, RecordObjectMapper.newInstance(SecUser.class), emailPhone); if(org.springframework.util.ObjectUtils.isEmpty(userList)) { return null; } userName = userList.get(0).getUsername(); } String userSql="SELECT * FROM SCT_USER WHERE USERNAME=?"; List users=jdbcTemplate.query(userSql, RecordObjectMapper.newInstance(SecUser.class), userName); SecUser user=null; if(null==users || users.isEmpty() || null==(user=users.get(0))) return null; return bindRoleResource(user); } @Override public SecUser findValidUserByLoginName(String loginName, String[] rolesArrty) { if(ObjectUtils.isEmpty(loginName) || ObjectUtils.isEmpty(rolesArrty)) return null; SecUser user = findUserByLoginName(loginName); if (null == user) return null; Set userRoleSet=user.getRoles(); if(null==userRoleSet || userRoleSet.isEmpty()) return null; Set allRoleSet=Sets.newHashSet(rolesArrty); allRoleSet.retainAll(userRoleSet.stream().map(role->role.getRoleName()).collect(Collectors.toSet())); return allRoleSet.isEmpty()?null:user; } @Override public void updatePassword(String username, String oldpassword, String newPassword) { if(ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(oldpassword) || ObjectUtils.isEmpty(newPassword)) return; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); List users=jdbcTemplate.query("SELECT * FROM SCT_USER WHERE USERNAME=?",RecordObjectMapper.newInstance(SecUser.class),username); if(null==users || users.isEmpty()) return; SecUser user=users.get(0); if(null==user) return; if (passwordEncoder.encodePassword(oldpassword,username).equals(user.getPassword())) { jdbcTemplate.update("UPDATE SCT_USER SET PASSWORD=? WHERE UUID=?",passwordEncoder.encodePassword(newPassword,username),user.getId()); } else { throw new BusinessException("旧密码不正确"); } } @Override public void updatePassword(String username, String password) { if(ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(password)) return; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); List users=jdbcTemplate.query("SELECT * FROM SCT_USER WHERE USERNAME=?",RecordObjectMapper.newInstance(SecUser.class),username); if(null==users || users.isEmpty()) throw new BusinessException("没有找到用户"); SecUser user=users.get(0); if(null==user) throw new BusinessException("没有找到用户"); jdbcTemplate.update("UPDATE SCT_USER SET PASSWORD=? WHERE UUID=?",passwordEncoder.encodePassword(password,username),user.getId()); } @Override public void updateSafeword(String username, String oldpassword, String newPassword) { if(ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(oldpassword) || ObjectUtils.isEmpty(newPassword)) return; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); List users=jdbcTemplate.query("SELECT * FROM SCT_USER WHERE USERNAME=?",RecordObjectMapper.newInstance(SecUser.class),username); if(null==users || users.isEmpty()) return; SecUser user=users.get(0); if(null==user) return; String oldpassword_encoder = passwordEncoder.encodePassword(oldpassword, username); if(!StringUtils.isNullOrEmpty(user.getSafeword())) { if (oldpassword_encoder.equals(user.getSafeword())) { jdbcTemplate.update("UPDATE SCT_USER SET SAFEWORD=? WHERE UUID=?",passwordEncoder.encodePassword(newPassword,username),user.getId()); } else { throw new BusinessException("旧密码不正确"); } }else { jdbcTemplate.update("UPDATE SCT_USER SET SAFEWORD=? WHERE UUID=?",passwordEncoder.encodePassword(newPassword,username),user.getId()); } } @Override public void updateSafeword(String username, String newPassword) { if(ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(newPassword)) return; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); List users=jdbcTemplate.query("SELECT * FROM SCT_USER WHERE USERNAME=?",RecordObjectMapper.newInstance(SecUser.class),username); if(null==users || users.isEmpty()) throw new BusinessException("没有找到用户"); SecUser user=users.get(0); if(null==user) throw new BusinessException("没有找到用户"); jdbcTemplate.update("UPDATE SCT_USER SET SAFEWORD=? WHERE UUID=?",passwordEncoder.encodePassword(newPassword,username),user.getId()); } @Override public SecUser findUserByPartyId(Serializable partyId) { if(null==partyId) return null; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); List users=jdbcTemplate.query("SELECT * FROM SCT_USER WHERE PARTY_UUID=?",RecordObjectMapper.newInstance(SecUser.class),partyId); SecUser user=null; if(null==users || users.isEmpty() || null==(user=users.get(0))) return null; return bindRoleResource(user); } /** * 查找所有系统用户 */ public List findAllSysUsers() { JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); List users=jdbcTemplate.query("SELECT * FROM SCT_USER WHERE PARTY_UUID is null or PARTY_UUID=''",RecordObjectMapper.newInstance(SecUser.class)); if(null!=users) for(int i=0;i users=jdbcTemplate.query("SELECT * FROM SCT_USER WHERE UUID=? OR USERNAME=?",RecordObjectMapper.newInstance(SecUser.class),user.getId(),user.getUsername()); SecUser dbUser=null; if(null==users || users.isEmpty() || null==(dbUser=users.get(0))) { //execute insert Object[] jdbcParams=ApplicationUtil.getInsertStatement(user); String insertUserSql=(String)jdbcParams[0]; Object[] sqlParameters=(Object[])jdbcParams[1]; jdbcTemplate.update(insertUserSql,sqlParameters); }else { //execute update if(null==user.getId()) user.setId(dbUser.getId()); if(null==user.getUsername()) user.setUsername(dbUser.getUsername()); if(null==user.getId()) user.setId(ApplicationUtil.getCurrentTimeUUID()); Object[] jdbcParams=ApplicationUtil.getUpdateStatement(user,"WHERE UUID=? OR USERNAME=?",new Object[] {user.getId(),user.getUsername()}); String updateUserSql=(String)jdbcParams[0]; Object[] sqlParameters=(Object[])jdbcParams[1]; jdbcTemplate.update(updateUserSql,sqlParameters); } cascadeRole(user); } @Override public SecUser findUserById(Serializable id) { if(null==id) return null; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); List users=jdbcTemplate.query("SELECT * FROM SCT_USER WHERE UUID=?",RecordObjectMapper.newInstance(SecUser.class),id); SecUser user=null; if(null==users || users.isEmpty() || null==(user=users.get(0))) return null; return bindRoleResource(user); } /** * 级联角色资源 * @param secuser 用户对象 */ private static final void cascadeRole(SecUser secuser) { if(null==secuser) return; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); Serializable userId=secuser.getId(); Set roles=secuser.getRoles(); jdbcTemplate.update("DELETE FROM SCT_USER_ROLE WHERE USER_UUID=?",userId); if(ObjectUtils.isEmpty(roles)) return; List argList=roles.stream().map(role->new Object[] {userId,role.getId()}).collect(Collectors.toList()); jdbcTemplate.batchUpdate("INSERT INTO SCT_USER_ROLE(USER_UUID,ROLE_UUID) VALUES(?,?)", argList); } /** * 绑定角色资源 * @param secuser 用户对象 */ public static final SecUser bindRoleResource(SecUser secuser) { if(null==secuser) return secuser; JdbcTemplate jdbcTemplate=ApplicationUtil.getBean(JdbcTemplate.class); String roleSql="SELECT * FROM SCT_ROLE SR WHERE EXISTS (SELECT ROLE_UUID FROM SCT_USER_ROLE WHERE USER_UUID=? AND ROLE_UUID=SR.UUID)"; List roleList=jdbcTemplate.query(roleSql, RecordObjectMapper.newInstance(Role.class), secuser.getId()); if(null==roleList || roleList.isEmpty()) return secuser; Set roleSet=roleList.stream().filter(role->null!=role).collect(Collectors.toSet()); secuser.setRoles(roleSet); String resoSql="SELECT * FROM SCT_RESOURCE SR WHERE EXISTS (SELECT RESOURCE_UUID FROM SCT_ROLE_RESOURCE WHERE ROLE_UUID=? AND RESOURCE_UUID=SR.UUID)"; for(Role role:roleSet) { List resoList=jdbcTemplate.query(resoSql, RecordObjectMapper.newInstance(Resource.class), role.getId()); if(null==resoList || resoList.isEmpty()) continue; role.setResources(resoList.stream().filter(reso->null!=reso).collect(Collectors.toSet())); } return secuser; } // 手机号校验 private boolean isValidPhone(String username) { Pattern p = Pattern.compile("[0-9]*"); return p.matcher(username).matches(); } // 邮箱校验 private boolean isValidEmail(String username) { String regexPattern = "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@" + "[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$"; return Pattern.compile(regexPattern) .matcher(username) .matches(); } }