diff --git a/basic-properties/src/main/java/ink/wgink/properties/ServerProperties.java b/basic-properties/src/main/java/ink/wgink/properties/ServerProperties.java index 08e3db33..63e5cfd1 100644 --- a/basic-properties/src/main/java/ink/wgink/properties/ServerProperties.java +++ b/basic-properties/src/main/java/ink/wgink/properties/ServerProperties.java @@ -49,6 +49,10 @@ public class ServerProperties { * 初始化 */ private ServerInitProperties init; + /** + * 主节点 + */ + private Boolean masterNode; public Integer getPort() { return port; @@ -114,6 +118,14 @@ public class ServerProperties { this.init = init; } + public Boolean getMasterNode() { + return masterNode == null ? false : masterNode; + } + + public void setMasterNode(Boolean masterNode) { + this.masterNode = masterNode; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("{"); @@ -131,6 +143,10 @@ public class ServerProperties { .append(defaultIndexPage).append('\"'); sb.append(",\"defaultHomePage\":\"") .append(defaultHomePage).append('\"'); + sb.append(",\"init\":") + .append(init); + sb.append(",\"masterNode\":") + .append(masterNode); sb.append('}'); return sb.toString(); } diff --git a/basic-util/src/main/java/ink/wgink/util/thread/CachedThreadPoolUtil.java b/basic-util/src/main/java/ink/wgink/util/thread/CachedThreadPoolUtil.java new file mode 100644 index 00000000..735f60e3 --- /dev/null +++ b/basic-util/src/main/java/ink/wgink/util/thread/CachedThreadPoolUtil.java @@ -0,0 +1,40 @@ +package ink.wgink.util.thread; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @ClassName: CachedThreadPoolUtil + * @Description: 缓存线程池 + * @Author: wanggeng + * @Date: 2022/5/20 00:27 + * @Version: 1.0 + */ +public class CachedThreadPoolUtil { + + private static final Logger LOG = LoggerFactory.getLogger(CachedThreadPoolUtil.class); + + /** + * 最多66个线程,保持60s + */ + private static ExecutorService executorService = new ThreadPoolExecutor(0, 66, + 60L, TimeUnit.SECONDS, + new SynchronousQueue<>()); + + /** + * 执行线程 + * + * @param runnable + */ + public static void execute(Runnable runnable) { + LOG.debug("****************** execute"); + executorService.execute(runnable); + } + + +} diff --git a/login-base/src/main/java/ink/wgink/login/base/authentication/user/UserAuthenticationProvider.java b/login-base/src/main/java/ink/wgink/login/base/authentication/user/UserAuthenticationProvider.java index edde1d17..ece842a2 100644 --- a/login-base/src/main/java/ink/wgink/login/base/authentication/user/UserAuthenticationProvider.java +++ b/login-base/src/main/java/ink/wgink/login/base/authentication/user/UserAuthenticationProvider.java @@ -1,44 +1,21 @@ package ink.wgink.login.base.authentication.user; -import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.interfaces.expand.login.ILoginHandlerService; -import ink.wgink.interfaces.group.IGroupUserBaseService; -import ink.wgink.interfaces.position.IPositionUserBaseService; -import ink.wgink.interfaces.role.IRoleBaseService; -import ink.wgink.interfaces.role.IRoleMenuBaseService; -import ink.wgink.interfaces.role.IRolePermissionBaseService; -import ink.wgink.interfaces.role.IRoleUserBaseService; +import ink.wgink.interfaces.user.mongo.IMongoLoginUserService; import ink.wgink.login.base.consts.IUserCenterConst; import ink.wgink.login.base.enums.LoginTypeEnum; import ink.wgink.login.base.exceptions.UserAuthenticationException; import ink.wgink.login.base.service.user.UserLoginService; import ink.wgink.pojo.bos.LoginUser; -import ink.wgink.pojo.bos.RoleGrantedAuthorityBO; -import ink.wgink.pojo.dtos.department.DepartmentSimpleDTO; -import ink.wgink.pojo.dtos.group.GroupSimpleDTO; -import ink.wgink.pojo.dtos.position.PositionSimpleDTO; -import ink.wgink.pojo.dtos.role.RoleSimpleDTO; -import ink.wgink.pojo.pos.DepartmentPO; -import ink.wgink.pojo.pos.GroupPO; -import ink.wgink.pojo.pos.PositionPO; -import ink.wgink.pojo.pos.RolePO; -import ink.wgink.properties.AccessControlProperties; -import ink.wgink.service.department.service.IDepartmentUserService; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import javax.servlet.http.HttpSession; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; /** * When you feel like quitting. Think about why you started @@ -55,15 +32,8 @@ public class UserAuthenticationProvider implements AuthenticationProvider { private UserDetailsService userDetailsService; private PasswordEncoder passwordEncoder; private UserLoginService userLoginService; - private IRoleBaseService roleBaseService; - private IRoleUserBaseService roleUserBaseService; - private IRoleMenuBaseService roleMenuBaseService; - private IRolePermissionBaseService rolePermissionService; - private IGroupUserBaseService groupUserBaseService; - private IPositionUserBaseService positionUserBaseService; private ILoginHandlerService loginHandler; - private IDepartmentUserService departmentUserService; - private AccessControlProperties accessControlProperties; + private IMongoLoginUserService mongoLoginUserService; private HttpSession httpSession; @Override @@ -71,74 +41,28 @@ public class UserAuthenticationProvider implements AuthenticationProvider { UserAuthenticationToken userAuthenticationToken = (UserAuthenticationToken) authentication; String username = userAuthenticationToken.getPrincipal().toString(); httpSession.setAttribute(IUserCenterConst.LOGIN_USERNAME, username); - LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(username); + LoginUser loginUser = null; + if (mongoLoginUserService != null) { + // mongo 存在,走 MongoDB + loginUser = mongoLoginUserService.getByUsername(username); + } + // 当loginUser为空时,查询数据库,确保用户不存在 + if (loginUser == null) { + loginUser = (LoginUser) userDetailsService.loadUserByUsername(username); + // 设置登录用户信息 + userLoginService.setLoginUserInfo(loginUser); + } if (!passwordEncoder.matches(userAuthenticationToken.getCredentials().toString(), loginUser.getPassword())) { throw new UserAuthenticationException("用户名或密码错误"); } + if (loginUser.getAuthorities().isEmpty()) { + throw new UserAuthenticationException(loginUser.getUsername() + "用户无任何角色"); + } // 清空session中的错误信息 httpSession.removeAttribute(IUserCenterConst.ERROR_MESSAGE); httpSession.removeAttribute(IUserCenterConst.LOGIN_USERNAME); - LOG.debug("set authority"); - Set grantedAuthorities = new LinkedHashSet<>(); - // 超管用户 - boolean isAdmin = false; - if (StringUtils.equalsIgnoreCase(ISystemConstant.ADMIN, loginUser.getUsername())) { - grantedAuthorities.add(new RoleGrantedAuthorityBO(ISystemConstant.ADMIN)); - } else { - List rolePOs = null; - // 先处理授权,再创建对象,否则 grantedAuthorities 中无法赋值 - if (roleUserBaseService != null) { - LOG.debug("check is admin"); - List roleIds = roleUserBaseService.listRoleIdByUserId(loginUser.getUserId()); - isAdmin = hasAdmin(roleIds); - if (!isAdmin) { - LOG.debug("set role, not admin"); - rolePOs = roleUserBaseService.listRolePOByRoleIds(roleIds); - removalDuplicateRole(rolePOs); - grantedAuthorities.addAll(loadRoleAuthority(rolePOs)); - if (grantedAuthorities.isEmpty()) { - throw new UserAuthenticationException(loginUser.getUsername() + "用户无任何角色"); - } - } - } - // 标记超管 - if (isAdmin) { - LOG.debug("mark admin role"); - grantedAuthorities.add(new RoleGrantedAuthorityBO(ISystemConstant.ADMIN)); - } else { - // 非超管设置其他信息 - if (rolePOs != null) { - List roleSimpleDTOs = roleUserBaseService.listSimple(rolePOs); - loginUser.setRoles(roleSimpleDTOs); - } - - LOG.debug("set department"); - List departmentPOs = departmentUserService.listDepartmentPOByUserId(loginUser.getUserId()); - List departmentSimpleDTOs = departmentUserService.listSimple(departmentPOs); - loginUser.setDepartments(departmentSimpleDTOs); - - if (groupUserBaseService != null) { - LOG.debug("set group"); - List groupPOs = groupUserBaseService.listGroupPOByUserId(loginUser.getUserId()); - List groupSimpleDTOs = groupUserBaseService.listSimple(groupPOs); - loginUser.setGroups(groupSimpleDTOs); - } - if (positionUserBaseService != null) { - LOG.debug("set position"); - List positionPOs = positionUserBaseService.listPositionPOByUserId(loginUser.getUserId()); - List positionSimpleDTOs = positionUserBaseService.listSimple(positionPOs); - loginUser.setPositions(positionSimpleDTOs); - } - } - } - // 设置权限 - loginUser.setAuthorities(grantedAuthorities); + // 登录逻辑处理 loginHandler(loginUser); - // 设置数据权限,排除超管 - if (!StringUtils.equalsIgnoreCase(ISystemConstant.ADMIN, loginUser.getUsername()) && !isAdmin) { - LOG.debug("set data authority"); - userLoginService.setUserDataAuthority(loginUser); - } // 更新登录信息 userLoginService.updateUserLoginInfo(loginUser.getUserId(), loginUser.getUserName(), LoginTypeEnum.USERNAME_AND_PASSWORD.getValue()); UserAuthenticationToken userAuthenticationTokenResult = new UserAuthenticationToken(loginUser, null, loginUser.getAuthorities()); @@ -146,20 +70,6 @@ public class UserAuthenticationProvider implements AuthenticationProvider { return userAuthenticationTokenResult; } - /** - * 是否超管 - * - * @param roleIds - * @return - */ - private boolean hasAdmin(List roleIds) { - for (String roleId : roleIds) { - if (StringUtils.equals(ISystemConstant.ADMIN, roleId)) { - return true; - } - } - return false; - } /** * 登录处理 @@ -177,62 +87,6 @@ public class UserAuthenticationProvider implements AuthenticationProvider { } } - - /** - * 角色授权列表 - * - * @param rolePOs - * @return - */ - private List loadRoleAuthority(List rolePOs) { - List grantedAuthorities = new ArrayList<>(); - if (null != rolePOs && !rolePOs.isEmpty()) { - // 设置菜单权限 - rolePOs.forEach((rolePO) -> { - List menuUrls = roleMenuBaseService.listMenuUrl(rolePO.getRoleId()); - List inserts = new ArrayList<>(); - List deletes = new ArrayList<>(); - List updates = new ArrayList<>(); - List queries = new ArrayList<>(); - if (accessControlProperties.getRolePermission()) { - inserts.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_INSERT)); - deletes.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_DELETE)); - updates.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_UPDATE)); - queries.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_QUERY)); - } - grantedAuthorities.add(new RoleGrantedAuthorityBO(rolePO.getRoleId(), rolePO.getRoleName(), menuUrls, inserts, deletes, updates, queries)); - }); - - } - return grantedAuthorities; - } - - /** - * 删除重复的角色 - * - * @param rolePOs - */ - private void removalDuplicateRole(List rolePOs) { - if (rolePOs == null || rolePOs.isEmpty()) { - return; - } - for (int i = 0; i < rolePOs.size(); i++) { - RolePO rolePO = rolePOs.get(i); - boolean isExist = false; - for (int j = i + 1; j < rolePOs.size(); j++) { - if (StringUtils.equals(rolePO.getRoleId(), rolePOs.get(j).getRoleId())) { - isExist = true; - break; - } - } - if (isExist) { - rolePOs.remove(i); - i--; - break; - } - } - } - @Override public boolean supports(Class authentication) { return UserAuthenticationToken.class.isAssignableFrom(authentication); @@ -250,39 +104,15 @@ public class UserAuthenticationProvider implements AuthenticationProvider { this.userLoginService = userLoginService; } - public void setRoleUserBaseService(IRoleUserBaseService roleUserBaseService) { - this.roleUserBaseService = roleUserBaseService; - } - - public void setRoleMenuBaseService(IRoleMenuBaseService roleMenuBaseService) { - this.roleMenuBaseService = roleMenuBaseService; - } - - public void setRolePermissionService(IRolePermissionBaseService rolePermissionService) { - this.rolePermissionService = rolePermissionService; - } - - public void setGroupUserBaseService(IGroupUserBaseService groupUserBaseService) { - this.groupUserBaseService = groupUserBaseService; - } - - public void setPositionUserBaseService(IPositionUserBaseService positionUserBaseService) { - this.positionUserBaseService = positionUserBaseService; + public void setHttpSession(HttpSession httpSession) { + this.httpSession = httpSession; } public void setLoginHandler(ILoginHandlerService loginHandler) { this.loginHandler = loginHandler; } - public void setDepartmentUserService(IDepartmentUserService departmentUserService) { - this.departmentUserService = departmentUserService; - } - - public void setAccessControlProperties(AccessControlProperties accessControlProperties) { - this.accessControlProperties = accessControlProperties; - } - - public void setHttpSession(HttpSession httpSession) { - this.httpSession = httpSession; + public void setMongoLoginUserService(IMongoLoginUserService mongoLoginUserService) { + this.mongoLoginUserService = mongoLoginUserService; } } diff --git a/login-base/src/main/java/ink/wgink/login/base/security/WebSecurityConfig.java b/login-base/src/main/java/ink/wgink/login/base/security/WebSecurityConfig.java index 55ecb88d..60df7a46 100644 --- a/login-base/src/main/java/ink/wgink/login/base/security/WebSecurityConfig.java +++ b/login-base/src/main/java/ink/wgink/login/base/security/WebSecurityConfig.java @@ -2,19 +2,13 @@ package ink.wgink.login.base.security; import ink.wgink.common.handler.AccessDenyHandler; import ink.wgink.interfaces.expand.login.ILoginHandlerService; -import ink.wgink.interfaces.group.IGroupUserBaseService; -import ink.wgink.interfaces.position.IPositionUserBaseService; -import ink.wgink.interfaces.role.IRoleMenuBaseService; -import ink.wgink.interfaces.role.IRolePermissionBaseService; -import ink.wgink.interfaces.role.IRoleUserBaseService; +import ink.wgink.interfaces.user.mongo.IMongoLoginUserService; import ink.wgink.login.base.handler.LoginFailureHandler; import ink.wgink.login.base.handler.LogoutHandler; import ink.wgink.login.base.security.user.UserSecurityConfig; import ink.wgink.login.base.service.user.UserDetailServiceImpl; import ink.wgink.login.base.service.user.UserLoginService; -import ink.wgink.properties.AccessControlProperties; import ink.wgink.properties.BaseProperties; -import ink.wgink.service.department.service.IDepartmentUserService; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -44,25 +38,13 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserLoginService userLoginService; @Autowired(required = false) - private IRoleUserBaseService roleUserBaseService; - @Autowired(required = false) - private IRoleMenuBaseService roleMenuBaseService; - @Autowired(required = false) - private IRolePermissionBaseService rolePermissionService; - @Autowired(required = false) - private IGroupUserBaseService groupUserBaseService; - @Autowired(required = false) - private IPositionUserBaseService positionUserBaseService; - @Autowired(required = false) private ILoginHandlerService loginHandler; @Autowired - private IDepartmentUserService departmentUserService; - @Autowired - private AccessControlProperties accessControlProperties; - @Autowired private HttpSession httpSession; @Autowired private PasswordEncoder passwordEncoder; + @Autowired(required = false) + private IMongoLoginUserService mongoLoginUserService; @Override protected void configure(HttpSecurity http) throws Exception { @@ -136,15 +118,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { userSecurityConfig.setLoginProcessUrl(baseProperties.getLoginProcess()); userSecurityConfig.setLoginFailureHandler(loginFailureHandler); userSecurityConfig.setUserLoginService(userLoginService); - userSecurityConfig.setRoleUserBaseService(roleUserBaseService); - userSecurityConfig.setRoleMenuBaseService(roleMenuBaseService); - userSecurityConfig.setRolePermissionService(rolePermissionService); - userSecurityConfig.setGroupUserBaseService(groupUserBaseService); - userSecurityConfig.setPositionUserBaseService(positionUserBaseService); userSecurityConfig.setLoginHandler(loginHandler); - userSecurityConfig.setDepartmentUserService(departmentUserService); - userSecurityConfig.setAccessControlProperties(accessControlProperties); userSecurityConfig.setHttpSession(httpSession); + userSecurityConfig.setMongoLoginUserService(mongoLoginUserService); http.apply(userSecurityConfig); } diff --git a/login-base/src/main/java/ink/wgink/login/base/security/user/UserSecurityConfig.java b/login-base/src/main/java/ink/wgink/login/base/security/user/UserSecurityConfig.java index 40faa4b5..13ada07c 100644 --- a/login-base/src/main/java/ink/wgink/login/base/security/user/UserSecurityConfig.java +++ b/login-base/src/main/java/ink/wgink/login/base/security/user/UserSecurityConfig.java @@ -1,18 +1,12 @@ package ink.wgink.login.base.security.user; import ink.wgink.interfaces.expand.login.ILoginHandlerService; -import ink.wgink.interfaces.group.IGroupUserBaseService; -import ink.wgink.interfaces.position.IPositionUserBaseService; -import ink.wgink.interfaces.role.IRoleMenuBaseService; -import ink.wgink.interfaces.role.IRolePermissionBaseService; -import ink.wgink.interfaces.role.IRoleUserBaseService; +import ink.wgink.interfaces.user.mongo.IMongoLoginUserService; import ink.wgink.login.base.authentication.user.UserAuthenticationFilter; import ink.wgink.login.base.authentication.user.UserAuthenticationProvider; import ink.wgink.login.base.handler.LoginFailureHandler; import ink.wgink.login.base.service.user.UserDetailServiceImpl; import ink.wgink.login.base.service.user.UserLoginService; -import ink.wgink.properties.AccessControlProperties; -import ink.wgink.service.department.service.IDepartmentUserService; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -39,15 +33,9 @@ public class UserSecurityConfig extends SecurityConfigurerAdapter grantedAuthorities = new LinkedHashSet<>(); + boolean isAdmin = false; + if (StringUtils.equalsIgnoreCase(ISystemConstant.ADMIN, loginUser.getUsername())) { + grantedAuthorities.add(new RoleGrantedAuthorityBO(ISystemConstant.ADMIN)); + } else { + List rolePOs = null; + // 先处理授权,再创建对象,否则 grantedAuthorities 中无法赋值 + if (roleUserBaseService != null) { + LOG.debug("check is admin"); + List roleIds = roleUserBaseService.listRoleIdByUserId(loginUser.getUserId()); + isAdmin = UserLoginUtil.hasAdmin(roleIds); + if (!isAdmin && loginUser.getUserType().equals(UserTypeEnum.SYSTEM.getValue())) { + // 非管理员,系统用户设置角色权限 + LOG.debug("set role, not admin"); + rolePOs = roleUserBaseService.listRolePOByRoleIds(roleIds); + UserLoginUtil.removalDuplicateRole(rolePOs); + grantedAuthorities.addAll(loadRoleAuthority(rolePOs)); + } + } + // 标记超管 + if (isAdmin) { + LOG.debug("mark admin role"); + grantedAuthorities.add(new RoleGrantedAuthorityBO(ISystemConstant.ADMIN)); + } else { + // 非超管设置其他信息 + if (rolePOs != null) { + List roleSimpleDTOs = roleUserBaseService.listSimple(rolePOs); + loginUser.setRoles(roleSimpleDTOs); + } + + LOG.debug("set department"); + List departmentPOs = departmentUserService.listDepartmentPOByUserId(loginUser.getUserId()); + List departmentSimpleDTOs = departmentUserService.listSimple(departmentPOs); + loginUser.setDepartments(departmentSimpleDTOs); + + if (groupUserBaseService != null) { + LOG.debug("set group"); + List groupPOs = groupUserBaseService.listGroupPOByUserId(loginUser.getUserId()); + List groupSimpleDTOs = groupUserBaseService.listSimple(groupPOs); + loginUser.setGroups(groupSimpleDTOs); + } + if (positionUserBaseService != null) { + LOG.debug("set position"); + List positionPOs = positionUserBaseService.listPositionPOByUserId(loginUser.getUserId()); + List positionSimpleDTOs = positionUserBaseService.listSimple(positionPOs); + loginUser.setPositions(positionSimpleDTOs); + } + } + } + // 设置数据权限,排除超管 + if (!StringUtils.equalsIgnoreCase(ISystemConstant.ADMIN, loginUser.getUsername()) && !isAdmin) { + // 非管理员,系统用户设置数据权限 + if (loginUser.getUserType().equals(UserTypeEnum.SYSTEM.getValue())) { + LOG.debug("set data authority"); + setUserDataAuthority(loginUser); + } + } + loginUser.setAuthorities(grantedAuthorities); + } /** * 设置人员数据权限 @@ -160,4 +249,33 @@ public class UserLoginService { return roleDataAuthority; } + /** + * 角色授权列表 + * + * @param rolePOs + * @return + */ + private List loadRoleAuthority(List rolePOs) { + List grantedAuthorities = new ArrayList<>(); + if (null != rolePOs && !rolePOs.isEmpty()) { + // 设置菜单权限 + rolePOs.forEach((rolePO) -> { + List menuUrls = roleMenuBaseService.listMenuUrl(rolePO.getRoleId()); + List inserts = new ArrayList<>(); + List deletes = new ArrayList<>(); + List updates = new ArrayList<>(); + List queries = new ArrayList<>(); + if (accessControlProperties.getRolePermission()) { + inserts.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_INSERT)); + deletes.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_DELETE)); + updates.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_UPDATE)); + queries.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_QUERY)); + } + grantedAuthorities.add(new RoleGrantedAuthorityBO(rolePO.getRoleId(), rolePO.getRoleName(), menuUrls, inserts, deletes, updates, queries)); + }); + + } + return grantedAuthorities; + } + } diff --git a/login-base/src/main/java/ink/wgink/login/base/util/UserLoginUtil.java b/login-base/src/main/java/ink/wgink/login/base/util/UserLoginUtil.java index c33b0ee2..feeda2ad 100644 --- a/login-base/src/main/java/ink/wgink/login/base/util/UserLoginUtil.java +++ b/login-base/src/main/java/ink/wgink/login/base/util/UserLoginUtil.java @@ -1,14 +1,10 @@ package ink.wgink.login.base.util; import ink.wgink.interfaces.consts.ISystemConstant; -import ink.wgink.login.base.manager.ConfigManager; -import ink.wgink.pojo.bos.LoginUser; -import ink.wgink.service.user.pojo.pos.UserPO; +import ink.wgink.pojo.pos.RolePO; import org.apache.commons.lang3.StringUtils; -import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormat; -import java.util.Map; +import java.util.List; /** * @Description: 用户登录 @@ -19,75 +15,44 @@ import java.util.Map; public class UserLoginUtil { /** - * 创建登录用户 + * 删除重复的角色 * - * @param userPO - * @return + * @param rolePOs */ - public static LoginUser createLoginUser(UserPO userPO) { - LoginUser loginUser = new LoginUser(userPO.getUserUsername(), userPO.getUserPassword(), - userPO.getUserType() == 1 ? true : false, - isAccountNonExpired(userPO), - isCredentialsNonExpired(userPO), - userPO.getUserState() == 0 ? true : false); - loginUser.setUserId(userPO.getUserId()); - loginUser.setUserName(userPO.getUserName()); - loginUser.setUserPhone(userPO.getUserPhone()); - loginUser.setUserUKey(userPO.getUserUKey()); - loginUser.setLoginType(userPO.getLoginType()); - loginUser.setUserEmail(userPO.getUserEmail()); - loginUser.setUserAvatar(userPO.getUserAvatar()); - return loginUser; - } - - /** - * 账号是否没有过期 - * - * @param userPO - * @return - */ - private static boolean isAccountNonExpired(UserPO userPO) { - if (StringUtils.equals(userPO.getUserUsername(), ISystemConstant.ADMIN)) { - return true; + public static void removalDuplicateRole(List rolePOs) { + if (rolePOs == null || rolePOs.isEmpty()) { + return; } - if (!StringUtils.isBlank(userPO.getUserExpiredDate())) { - // 判断用户是否超时失效 - DateTime expiredDateTime = DateTime.parse(userPO.getUserExpiredDate(), DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS)); - DateTime nowDateTime = DateTime.now(); - if (expiredDateTime.isBefore(nowDateTime)) { - return false; + for (int i = 0; i < rolePOs.size(); i++) { + RolePO rolePO = rolePOs.get(i); + boolean isExist = false; + for (int j = i + 1; j < rolePOs.size(); j++) { + if (StringUtils.equals(rolePO.getRoleId(), rolePOs.get(j).getRoleId())) { + isExist = true; + break; + } + } + if (isExist) { + rolePOs.remove(i); + i--; + break; } } - return true; } /** - * 密码是否没有过期 + * 是否超管 * - * @param userPO + * @param roleIds * @return */ - private static boolean isCredentialsNonExpired(UserPO userPO) { - if (StringUtils.equals(userPO.getUserUsername(), ISystemConstant.ADMIN)) { - return true; - } - Map config = ConfigManager.getInstance().getConfig(); - String passwordValidity = config.get("passwordValidity"); - // 自定义密码有效期 - if (StringUtils.equals(passwordValidity, "custom")) { - Object passwordValidityDays = config.get("passwordValidityDays"); - int validityDays = passwordValidityDays == null ? 0 : (Integer) passwordValidityDays; - if (validityDays <= 0) { + public static boolean hasAdmin(List roleIds) { + for (String roleId : roleIds) { + if (StringUtils.equals(ISystemConstant.ADMIN, roleId)) { return true; } - DateTime passwordModifiedDateTime = DateTime.parse(userPO.getGmtPasswordModified(), DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS)); - DateTime passwordExpiredDateTime = passwordModifiedDateTime.plusDays(validityDays); - DateTime nowDateTime = DateTime.now(); - if (passwordExpiredDateTime.isBefore(nowDateTime)) { - return false; - } } - return true; + return false; } } diff --git a/mongo-login/pom.xml b/mongo-login/pom.xml index a518863d..9b10e00d 100644 --- a/mongo-login/pom.xml +++ b/mongo-login/pom.xml @@ -24,11 +24,6 @@ 1.0-SNAPSHOT provided - - ink.wgink - common - 1.0-SNAPSHOT - \ No newline at end of file diff --git a/mongo-login/src/main/java/ink/wgink/mongo/login/service/impl/MongoLoginServiceImpl.java b/mongo-login/src/main/java/ink/wgink/mongo/login/service/impl/MongoLoginServiceImpl.java deleted file mode 100644 index 37582147..00000000 --- a/mongo-login/src/main/java/ink/wgink/mongo/login/service/impl/MongoLoginServiceImpl.java +++ /dev/null @@ -1,124 +0,0 @@ -package ink.wgink.mongo.login.service.impl; - -import ink.wgink.common.base.DefaultBaseService; -import ink.wgink.interfaces.consts.ISystemConstant; -import ink.wgink.interfaces.department.IDepartmentUserBaseService; -import ink.wgink.interfaces.group.IGroupUserBaseService; -import ink.wgink.interfaces.login.mongo.IMongoLoginService; -import ink.wgink.interfaces.position.IPositionUserBaseService; -import ink.wgink.interfaces.role.IRoleMenuBaseService; -import ink.wgink.interfaces.role.IRolePermissionBaseService; -import ink.wgink.interfaces.role.IRoleUserBaseService; -import ink.wgink.login.base.util.UserLoginUtil; -import ink.wgink.pojo.pos.RolePO; -import ink.wgink.pojo.pos.user.mongo.MongoUserPO; -import ink.wgink.service.user.pojo.pos.UserPO; -import ink.wgink.service.user.service.IUserService; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * @ClassName: MongoLoginServiceImpl - * @Description: mongo登录 - * @Author: wanggeng - * @Date: 2022/5/19 11:31 - * @Version: 1.0 - */ -@Service -public class MongoLoginServiceImpl extends DefaultBaseService implements IMongoLoginService { - - private static final String COLLECTION_NAME = "loginUser"; - @Autowired - private MongoTemplate mongoTemplate; - @Autowired - private IUserService userService; - @Autowired(required = false) - private IDepartmentUserBaseService departmentUserBaseService; - @Autowired(required = false) - private IRoleUserBaseService roleUserBaseService; - @Autowired(required = false) - private IRoleMenuBaseService roleMenuBaseService; - @Autowired(required = false) - private IRolePermissionBaseService rolePermissionService; - @Autowired(required = false) - private IGroupUserBaseService groupUserBaseService; - @Autowired(required = false) - private IPositionUserBaseService positionUserBaseService; - - @Override - public void update(String userId) { - UserPO userPO = userService.getPO(userId); - UserLoginUtil.createLoginUser(userPO); - // 非系统管理员 - if (!StringUtils.equalsIgnoreCase(userPO.getUserUsername(), ISystemConstant.ADMIN)) { - - } - - } - - @Override - public void delete(List userIds) { - - } - - @Override - public MongoUserPO getPO(String userId) { - return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("userId").is(userId)), MongoUserPO.class, COLLECTION_NAME); - } - - @Override - public MongoUserPO getPOByUsername(String username) { - return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("userUsername").is(username)), MongoUserPO.class, COLLECTION_NAME); - } - - /** - * 设置用户信息 - * - * @param userPO - */ - private void setMongoUserInfo(MongoUserPO mongoUserPO) { - - } - - private boolean hasAdmin(List roleIds) { - for (String roleId : roleIds) { - if (StringUtils.equals(ISystemConstant.ADMIN, roleId)) { - return true; - } - } - return false; - } - - /** - * 删除重复的角色 - * - * @param rolePOs - */ - private void removalDuplicateRole(List rolePOs) { - if (rolePOs == null || rolePOs.isEmpty()) { - return; - } - for (int i = 0; i < rolePOs.size(); i++) { - RolePO rolePO = rolePOs.get(i); - boolean isExist = false; - for (int j = i + 1; j < rolePOs.size(); j++) { - if (StringUtils.equals(rolePO.getRoleId(), rolePOs.get(j).getRoleId())) { - isExist = true; - break; - } - } - if (isExist) { - rolePOs.remove(i); - i--; - break; - } - } - } - -} diff --git a/mongo-login/src/main/java/ink/wgink/mongo/login/service/impl/MongoLoginUserServiceImpl.java b/mongo-login/src/main/java/ink/wgink/mongo/login/service/impl/MongoLoginUserServiceImpl.java new file mode 100644 index 00000000..f4ab2c1d --- /dev/null +++ b/mongo-login/src/main/java/ink/wgink/mongo/login/service/impl/MongoLoginUserServiceImpl.java @@ -0,0 +1,90 @@ +package ink.wgink.mongo.login.service.impl; + +import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.interfaces.user.mongo.IMongoLoginUserService; +import ink.wgink.login.base.service.user.UserLoginService; +import ink.wgink.pojo.bos.LoginUser; +import ink.wgink.service.department.service.IDepartmentUserService; +import ink.wgink.service.user.enums.UserTypeEnum; +import ink.wgink.service.user.pojo.pos.UserPO; +import ink.wgink.service.user.service.IUserService; +import ink.wgink.service.user.util.UserUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * @ClassName: MongoLoginServiceImpl + * @Description: mongo登录 + * @Author: wanggeng + * @Date: 2022/5/19 11:31 + * @Version: 1.0 + */ +@Service +public class MongoLoginUserServiceImpl extends DefaultBaseService implements IMongoLoginUserService { + + private static final String COLLECTION_NAME = "loginUser"; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private IUserService userService; + @Autowired + private UserLoginService userLoginService; + @Autowired + private IDepartmentUserService departmentUserService; + + @Override + public void updateByUserId(String userId) { + UserPO userPO = userService.getPO(userId); + LoginUser loginUser = UserUtil.createLoginUser(userPO); + update(loginUser); + } + + @Override + public void updateByUserIds(List userIds) { + userService.listPOByUserIds(userIds).forEach(userPO -> { + LoginUser loginUser = UserUtil.createLoginUser(userPO); + update(loginUser); + }); + + } + + @Override + public void update(List loginUsers) { + loginUsers.forEach(this::update); + } + + @Override + public void update(LoginUser loginUser) { + // 系统用户、普通用户加载逻辑,公共用户不处理逻辑 + if (loginUser.getUserType().equals(UserTypeEnum.SYSTEM.getValue()) || + loginUser.getUserType().equals(UserTypeEnum.NORMAL.getValue())) { + userLoginService.setLoginUserInfo(loginUser); + } + // 删除原有 + delete(Arrays.asList(loginUser.getUserId())); + // 新增更新 + mongoTemplate.save(loginUser, COLLECTION_NAME); + } + + @Override + public void delete(List userIds) { + mongoTemplate.remove(Query.query(Criteria.where("userId").in(userIds)), COLLECTION_NAME); + } + + @Override + public LoginUser get(String userId) { + return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("userId").is(userId)), LoginUser.class, COLLECTION_NAME); + } + + @Override + public LoginUser getByUsername(String username) { + return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("userUsername").is(username)), LoginUser.class, COLLECTION_NAME); + } + +} diff --git a/mongo-login/src/main/java/ink/wgink/mongo/login/startup/MongoLoginStartUp.java b/mongo-login/src/main/java/ink/wgink/mongo/login/startup/MongoLoginStartUp.java new file mode 100644 index 00000000..6713cc23 --- /dev/null +++ b/mongo-login/src/main/java/ink/wgink/mongo/login/startup/MongoLoginStartUp.java @@ -0,0 +1,59 @@ +package ink.wgink.mongo.login.startup; + +import ink.wgink.interfaces.user.mongo.IMongoLoginUserService; +import ink.wgink.properties.ServerProperties; +import ink.wgink.service.user.service.IUserService; +import ink.wgink.service.user.util.UserUtil; +import ink.wgink.util.thread.CachedThreadPoolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ClassName: MongoLoginStartUp + * @Description: mongo启动 + * @Author: wanggeng + * @Date: 2022/5/19 16:25 + * @Version: 1.0 + */ +@Component +public class MongoLoginStartUp implements ApplicationRunner { + + private static final Logger LOG = LoggerFactory.getLogger(MongoLoginStartUp.class); + @Autowired + private ServerProperties serverProperties; + @Autowired + private IMongoLoginUserService mongoLoginUserService; + @Autowired + private IUserService userService; + + @Override + public void run(ApplicationArguments args) throws Exception { + if (serverProperties.getMasterNode()) { + LOG.debug("master-node: {}" + serverProperties.getMasterNode()); + CachedThreadPoolUtil.execute(() -> { + // 初始化所有账号内容 + System.out.println("**************************"); + System.out.println("** LoginUser Init Start **"); + System.out.println("**************************"); + long startTime = System.currentTimeMillis(); + Map params = new HashMap<>(0); + userService.listPO(params).forEach(userPO -> { + mongoLoginUserService.update(UserUtil.createLoginUser(userPO)); + }); + long endTime = System.currentTimeMillis(); + System.out.println("**************************"); + System.out.println("** LoginUser Init End **"); + System.out.println("**************************"); + LOG.debug("LoginUser init used time: {}ms", (endTime - startTime) / 1000L); + }); + } + } + +} diff --git a/service-department/src/main/java/ink/wgink/service/department/dao/IDepartmentUserDao.java b/service-department/src/main/java/ink/wgink/service/department/dao/IDepartmentUserDao.java index be43baa7..84fd04a9 100644 --- a/service-department/src/main/java/ink/wgink/service/department/dao/IDepartmentUserDao.java +++ b/service-department/src/main/java/ink/wgink/service/department/dao/IDepartmentUserDao.java @@ -7,6 +7,7 @@ import ink.wgink.exceptions.UpdateException; import ink.wgink.interfaces.init.IInitBaseTable; import ink.wgink.pojo.dtos.department.DepartmentUserDTO; import ink.wgink.pojo.dtos.user.UserDTO; +import ink.wgink.service.user.pojo.pos.UserPO; import org.springframework.stereotype.Repository; import java.util.List; @@ -84,6 +85,15 @@ public interface IDepartmentUserDao extends IInitBaseTable { */ List listDepartmentId(Map params) throws SearchException; + /** + * 用户列表 + * + * @param params + * @return + * @throws SearchException + */ + List listUserPO(Map params) throws SearchException; + /** * 用户列表 * diff --git a/service-department/src/main/java/ink/wgink/service/department/service/IDepartmentUserService.java b/service-department/src/main/java/ink/wgink/service/department/service/IDepartmentUserService.java index 132a2d70..97cc849e 100644 --- a/service-department/src/main/java/ink/wgink/service/department/service/IDepartmentUserService.java +++ b/service-department/src/main/java/ink/wgink/service/department/service/IDepartmentUserService.java @@ -8,6 +8,7 @@ import ink.wgink.pojo.dtos.user.UserDTO; import ink.wgink.pojo.pos.DepartmentPO; import ink.wgink.pojo.result.SuccessResultList; import ink.wgink.service.department.pojo.vos.DepartmentUserSortVO; +import ink.wgink.service.user.pojo.pos.UserPO; import java.util.List; import java.util.Map; @@ -46,7 +47,7 @@ public interface IDepartmentUserService extends IDepartmentUserBaseService { * 新增用户ID * * @param departmentId 部门ID - * @param userIds 新增的用户ID列表 + * @param userIds 新增的用户ID列表 */ void save(String departmentId, List userIds); @@ -148,6 +149,37 @@ public interface IDepartmentUserService extends IDepartmentUserBaseService { */ List listUser(Map requestParams); + /** + * 用户分页 + * + * @param page + * @return + */ SuccessResultList> listPageUser(ListPage page); + /** + * 用户列表 + * + * @param params + * @return + */ + List listUserPO(Map params); + + /** + * 用户列表 + * + * @param departmentId + * @return + */ + List listUserPOByDepartmentId(String departmentId); + + /** + * 用户列表 + * + * @param departmentIds + * @return + */ + List listUserPOByDepartmentIds(List departmentIds); + + } diff --git a/service-department/src/main/java/ink/wgink/service/department/service/impl/DepartmentUserServiceImpl.java b/service-department/src/main/java/ink/wgink/service/department/service/impl/DepartmentUserServiceImpl.java index 36a3e61f..e6895dfb 100644 --- a/service-department/src/main/java/ink/wgink/service/department/service/impl/DepartmentUserServiceImpl.java +++ b/service-department/src/main/java/ink/wgink/service/department/service/impl/DepartmentUserServiceImpl.java @@ -8,6 +8,7 @@ import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.interfaces.department.IDepartmentUserDeleteAfterHandler; import ink.wgink.interfaces.department.IDepartmentUserSaveAfterHandler; import ink.wgink.interfaces.user.IUserBaseService; +import ink.wgink.interfaces.user.mongo.IMongoLoginUserService; import ink.wgink.pojo.ListPage; import ink.wgink.pojo.dtos.department.DepartmentContainUserDTO; import ink.wgink.pojo.dtos.department.DepartmentDTO; @@ -21,6 +22,8 @@ import ink.wgink.service.department.pojo.vos.DepartmentUserSortVO; import ink.wgink.service.department.service.IDepartmentAdjustmentService; import ink.wgink.service.department.service.IDepartmentService; import ink.wgink.service.department.service.IDepartmentUserService; +import ink.wgink.service.user.pojo.pos.UserPO; +import ink.wgink.util.thread.CachedThreadPoolUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -53,6 +56,8 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe private IDepartmentUserSaveAfterHandler departmentUserSaveAfterHandler; @Autowired(required = false) private IDepartmentUserDeleteAfterHandler departmentUserDeleteAfterHandler; + @Autowired(required = false) + private IMongoLoginUserService mongoLoginUserService; @Override public void save(String departmentId, String departmentName, List departmentUserIds) { @@ -77,6 +82,7 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe i--; } } + updateMongoLoginUser(departmentUserIds); departmentAdjustmentService.save(existUserIds, departmentId, departmentName, USER_DEPARTMENT_TYPE_JOIN); if (departmentUserSaveAfterHandler != null) { departmentUserSaveAfterHandler.handle(departmentId, departmentUserIds); @@ -90,7 +96,6 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe throw new SearchException("部门不存在"); } save(departmentId, departmentPO.getDepartmentName(), userIds); - } @Override @@ -110,6 +115,7 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe params.put("departmentId", departmentId); params.put("userIds", userIds); departmentUserDao.delete(params); + updateMongoLoginUser(userIds); departmentAdjustmentService.save(userIds, departmentId, adjustmentDepartmentName, USER_DEPARTMENT_TYPE_LEAVE); if (departmentUserDeleteAfterHandler != null) { departmentUserDeleteAfterHandler.handle(departmentId, userIds); @@ -140,6 +146,7 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe params.put("userId", userId); departmentUserDao.save(params); } + updateMongoLoginUser(saveUserIds); } departmentAdjustmentService.save(saveUserIds, departmentId, departmentPO.getDepartmentName(), USER_DEPARTMENT_TYPE_JOIN); if (departmentUserSaveAfterHandler != null) { @@ -561,4 +568,40 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe departmentContainUserDTO.setUsers(listUserByDepartmentId(departmentPO.getDepartmentId())); return departmentContainUserDTO; } + + @Override + public List listUserPO(Map params) { + params = params == null ? getHashMap(0) : params; + return departmentUserDao.listUserPO(params); + } + + @Override + public List listUserPOByDepartmentId(String departmentId) { + Map params = getHashMap(2); + params.put("departmentId", departmentId); + return listUserPO(params); + } + + @Override + public List listUserPOByDepartmentIds(List departmentIds) { + if (departmentIds == null || departmentIds.isEmpty()) { + return new ArrayList<>(); + } + Map params = getHashMap(2); + params.put("departmentIds", departmentIds); + return listUserPO(params); + } + + /** + * 更新 mongo + * + * @param departmentUserIds + */ + private void updateMongoLoginUser(List departmentUserIds) { + if (mongoLoginUserService != null) { + CachedThreadPoolUtil.execute(() -> { + mongoLoginUserService.updateByUserIds(departmentUserIds); + }); + } + } } diff --git a/service-department/src/main/resources/mybatis/mapper/department-user-mapper.xml b/service-department/src/main/resources/mybatis/mapper/department-user-mapper.xml index 319c437f..670217b7 100644 --- a/service-department/src/main/resources/mybatis/mapper/department-user-mapper.xml +++ b/service-department/src/main/resources/mybatis/mapper/department-user-mapper.xml @@ -280,6 +280,93 @@ + + + + + + + + +