From 6e7c712456a8cf5693321edd2f3482aaf61d08b0 Mon Sep 17 00:00:00 2001 From: chenrui <1187576398@qq.com> Date: 星期二, 03 六月 2025 16:43:07 +0800 Subject: [PATCH] 登录修改 --- src/main/java/com/ruoyi/framework/security/LoginUser.java | 27 ++++++ src/main/java/com/ruoyi/framework/config/SecurityConfig.java | 2 src/main/java/com/ruoyi/framework/security/service/UserDetailsServiceImpl.java | 24 +++++ src/main/java/com/ruoyi/framework/security/service/SysLoginService.java | 91 ++++++++++++++++++++++ src/main/java/com/ruoyi/project/system/controller/SysLoginController.java | 45 ++++++++++- src/main/java/com/ruoyi/framework/security/LoginBody.java | 10 ++ src/main/java/com/ruoyi/project/system/domain/SysUser.java | 10 ++ src/main/resources/mapper/system/SysRoleMapper.xml | 1 8 files changed, 203 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index b04beff..0d12ac3 100644 --- a/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -111,7 +111,7 @@ .authorizeHttpRequests((requests) -> { permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); // 瀵逛簬鐧诲綍login 娉ㄥ唽register 楠岃瘉鐮乧aptchaImage 鍏佽鍖垮悕璁块棶 - requests.antMatchers("/login", "/register", "/captchaImage").permitAll() + requests.antMatchers("/login", "/register", "/captchaImage","/loginCheck","/userDeptList/**","/loginCheckFactory").permitAll() // 闈欐�佽祫婧愶紝鍙尶鍚嶈闂� .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() diff --git a/src/main/java/com/ruoyi/framework/security/LoginBody.java b/src/main/java/com/ruoyi/framework/security/LoginBody.java index e241edf..5ebc976 100644 --- a/src/main/java/com/ruoyi/framework/security/LoginBody.java +++ b/src/main/java/com/ruoyi/framework/security/LoginBody.java @@ -27,6 +27,16 @@ */ private String uuid; + private Long factoryId; + + public Long getFactoryId() { + return factoryId; + } + + public void setFactoryId(Long factoryId) { + this.factoryId = factoryId; + } + public String getUsername() { return username; diff --git a/src/main/java/com/ruoyi/framework/security/LoginUser.java b/src/main/java/com/ruoyi/framework/security/LoginUser.java index c1ce6ab..33f27a2 100644 --- a/src/main/java/com/ruoyi/framework/security/LoginUser.java +++ b/src/main/java/com/ruoyi/framework/security/LoginUser.java @@ -76,6 +76,11 @@ */ private Integer tenantId; + /** + * 褰撳墠閮ㄩ棬id + */ + private Long currentDeptId; + public LoginUser() { } @@ -101,6 +106,16 @@ this.user = user; this.permissions = permissions; this.tenantId = tenantId; + } + + public LoginUser(Long userId, Long [] deptIds, SysUser user,Integer tenantId,Long currentDeptId, Set<String> permissions) + { + this.userId = userId; + this.deptIds = deptIds; + this.user = user; + this.permissions = permissions; + this.tenantId = tenantId; + this.currentDeptId = currentDeptId; } public Long getUserId() @@ -285,4 +300,16 @@ public void setTenantId(Integer tenantId) { this.tenantId = tenantId; } + + public void setDeptIds(Long[] deptIds) { + this.deptIds = deptIds; + } + + public Long getCurrentDeptId() { + return currentDeptId; + } + + public void setCurrentDeptId(Long currentDeptId) { + this.currentDeptId = currentDeptId; + } } diff --git a/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java b/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java index 2c44d64..c2174ca 100644 --- a/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java +++ b/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java @@ -1,11 +1,14 @@ package com.ruoyi.framework.security.service; import javax.annotation.Resource; + +import com.ruoyi.framework.web.domain.AjaxResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; @@ -28,6 +31,10 @@ import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.service.ISysConfigService; import com.ruoyi.project.system.service.ISysUserService; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; /** * 鐧诲綍鏍¢獙鏂规硶 @@ -178,4 +185,88 @@ sysUser.setLoginDate(DateUtils.getNowDate()); userService.updateUserProfile(sysUser); } + + public Long loginCheck(String username, String password){ + loginPreCheck(username, password); + // 鐢ㄦ埛楠岃瘉 + Authentication authentication = null; + try + { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); + AuthenticationContextHolder.setContext(authenticationToken); + // 璇ユ柟娉曚細鍘昏皟鐢║serDetailsServiceImpl.loadUserByUsername + authentication = authenticationManager.authenticate(authenticationToken); + } + catch (Exception e) + { + if (e instanceof BadCredentialsException) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + finally + { + AuthenticationContextHolder.clearContext(); + } + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + return loginUser.getUserId(); + } + + /** + * 鐧诲綍楠岃瘉 + * + * @param username 鐢ㄦ埛鍚� + * @param password 瀵嗙爜 + * @param factoryId 鍏徃ID + * @return 缁撴灉 + */ + public String loginCheckFactory(String username, String password, Long factoryId) + { + // 鐧诲綍鍓嶇疆鏍¢獙 + loginPreCheck(username, password); + // 鐢ㄦ埛楠岃瘉 + Authentication authentication = null; + try + { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); + // 鎵╁睍缁嗚妭锛氬皢 companyId 鏀惧叆 details锛堝彲閫夋柟寮忥級 + // 浣跨敤 Map 瀛樺偍棰濆淇℃伅 + Map<String, Object> details = new HashMap<>(); + details.put("factoryId", factoryId); + authenticationToken.setDetails(details); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + AuthenticationContextHolder.setContext(authenticationToken); + // 璇ユ柟娉曚細鍘昏皟鐢║serDetailsServiceImpl.loadUserByUsername + authentication = authenticationManager.authenticate(authenticationToken); + } + catch (Exception e) + { + if (e instanceof BadCredentialsException) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + finally + { + AuthenticationContextHolder.clearContext(); + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + recordLoginInfo(loginUser.getUserId()); + // 鐢熸垚token + return tokenService.createToken(loginUser); + } + } diff --git a/src/main/java/com/ruoyi/framework/security/service/UserDetailsServiceImpl.java b/src/main/java/com/ruoyi/framework/security/service/UserDetailsServiceImpl.java index a5552b4..53cca34 100644 --- a/src/main/java/com/ruoyi/framework/security/service/UserDetailsServiceImpl.java +++ b/src/main/java/com/ruoyi/framework/security/service/UserDetailsServiceImpl.java @@ -1,8 +1,11 @@ package com.ruoyi.framework.security.service; +import com.ruoyi.project.system.mapper.SysDeptMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Service; @@ -13,6 +16,8 @@ import com.ruoyi.framework.security.LoginUser; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.service.ISysUserService; + +import java.util.Map; /** * 鐢ㄦ埛楠岃瘉澶勭悊 @@ -33,6 +38,9 @@ @Autowired private SysPermissionService permissionService; + @Autowired + private SysDeptMapper deptMapper; + @Override public UserDetails loadUserByUsername(String username) { @@ -52,7 +60,21 @@ log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username); throw new ServiceException(MessageUtils.message("user.blocked")); } + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + // 鑾峰彇 details + Object details = authentication.getDetails(); + Long factoryId = null; + if (details instanceof Map) { + factoryId = (Long) ((Map<?, ?>) details).get("factoryId"); + if(null != factoryId){ + // 鏌ヨ绉熸埛 + Long teantId = deptMapper.maxLevelDeptId(factoryId); + user.setCurrentDeptId(factoryId); + user.setTenantId(teantId.intValue()); + } + } + // 鑾峰彇鐢ㄦ埛褰撳墠鐧诲綍閮ㄩ棬锛屽苟鏌ヨ绉熸埛id passwordService.validate(user); return createLoginUser(user); @@ -60,6 +82,6 @@ public UserDetails createLoginUser(SysUser user) { - return new LoginUser(user.getUserId(), user.getDeptIds(), user, user.getTenantId(), permissionService.getMenuPermission(user)); + return new LoginUser(user.getUserId(), user.getDeptIds(), user, user.getTenantId(),user.getCurrentDeptId(), permissionService.getMenuPermission(user)); } } diff --git a/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java b/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java index b246c23..e7739aa 100644 --- a/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java +++ b/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java @@ -2,11 +2,11 @@ import java.util.List; import java.util.Set; + +import com.ruoyi.project.system.domain.vo.SysUserDeptVo; +import com.ruoyi.project.system.service.ISysUserDeptService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.security.LoginBody; @@ -38,6 +38,9 @@ @Autowired private TokenService tokenService; + + @Autowired + private ISysUserDeptService userDeptService; /** * 鐧诲綍鏂规硶 @@ -94,4 +97,38 @@ List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId); return AjaxResult.success(menuService.buildMenus(menus)); } + + @PostMapping("/loginCheck") + public AjaxResult loginCheck(@RequestBody LoginBody loginBody) + { + try { + Long userId = loginService.loginCheck(loginBody.getUsername(), loginBody.getPassword()); + return AjaxResult.success(userId); + }catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } + } + + @GetMapping("/userDeptList/{userId}") + public AjaxResult userDeptList(@PathVariable Long userId){ + SysUserDeptVo sysUserDeptVo = new SysUserDeptVo(); + sysUserDeptVo.setUserId(userId); + return AjaxResult.success(userDeptService.selectUserDeptList(sysUserDeptVo)); + } + + /** + * 閫夋嫨鍏徃鐧诲綍 + * + * @param loginBody 鐧诲綍淇℃伅 + * @return 缁撴灉 + */ + @PostMapping("/loginCheckFactory") + public AjaxResult loginCheckFactory(@RequestBody LoginBody loginBody) + { + AjaxResult ajax = AjaxResult.success(); + // 鐢熸垚浠ょ墝 + String token = loginService.loginCheckFactory(loginBody.getUsername(), loginBody.getPassword(),loginBody.getFactoryId()); + ajax.put(Constants.TOKEN, token); + return ajax; + } } diff --git a/src/main/java/com/ruoyi/project/system/domain/SysUser.java b/src/main/java/com/ruoyi/project/system/domain/SysUser.java index 3f7e227..e89ad32 100644 --- a/src/main/java/com/ruoyi/project/system/domain/SysUser.java +++ b/src/main/java/com/ruoyi/project/system/domain/SysUser.java @@ -95,11 +95,21 @@ @TableField(exist = false) private Long deptId; + private Long currentDeptId; + /** * 閮ㄩ棬鍚嶇О */ private String deptNames; + public Long getCurrentDeptId() { + return currentDeptId; + } + + public void setCurrentDeptId(Long currentDeptId) { + this.currentDeptId = currentDeptId; + } + public SysUser() { diff --git a/src/main/resources/mapper/system/SysRoleMapper.xml b/src/main/resources/mapper/system/SysRoleMapper.xml index 83e2e33..92ab684 100644 --- a/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/src/main/resources/mapper/system/SysRoleMapper.xml @@ -27,7 +27,6 @@ from sys_role r left join sys_user_role ur on ur.role_id = r.role_id left join sys_user u on u.user_id = ur.user_id - left join sys_dept d on u.dept_id = d.dept_id </sql> <select id="selectRoleList" parameterType="com.ruoyi.project.system.domain.SysRole" resultMap="SysRoleResult"> -- Gitblit v1.9.3