Просмотр исходного кода

optimizer: 租户被禁用,租户退出以后重新登录显示禁用,但是下面的业务员依然可以登录APP进行操作,

lipf 5 месяцев назад
Родитель
Сommit
1974605991

+ 22 - 0
authentication/src/main/java/com/jzg/client/OrganizationClient.java

@@ -0,0 +1,22 @@
+package com.jzg.client;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.user.vo.SysTennatVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import java.util.List;
+
+@FeignClient(name = "jzg-organization")
+public interface OrganizationClient {
+
+    /**
+     * 获取用户的租户列表(状态为启用的租户)
+     *
+     * @author lipf
+     * @date 2026/4/24 18:05
+     */
+    @PostMapping(value = "/userInfo/getTenantList")
+    HttpResult<List<SysTennatVo>> getTenantList();
+
+}

+ 26 - 4
authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java

@@ -9,9 +9,12 @@ import com.alipay.api.DefaultAlipayClient;
 import com.alipay.api.request.AlipaySystemOauthTokenRequest;
 import com.alipay.api.response.AlipaySystemOauthTokenResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jzg.client.OrganizationClient;
 import com.jzg.commons.constants.RedisKeyConstants;
 import com.jzg.commons.constants.SystemConstants;
+import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.po.*;
+import com.jzg.commons.entity.user.vo.SysTennatVo;
 import com.jzg.commons.entity.vo.SysRoleDataScopeVo;
 import com.jzg.commons.util.MinioUtils;
 import com.jzg.commons.util.StringUtils;
@@ -38,6 +41,7 @@ import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.util.CollectionUtils;
 
+import java.io.Serial;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
@@ -50,6 +54,8 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
     private static final Logger log = LoggerFactory.getLogger(JzgAuthenticationProvider.class);
 
     private UserDetailsService userDetailsService;
+    @Autowired
+    private OrganizationClient organizationClient;
 
     private SysUserService sysUserService;
 
@@ -88,6 +94,13 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
     }
 
 
+    /**
+     * 网页端登录和手机app登录使用同一个登录接口
+     * systemCode为APP的时候表示手机app登录(手机app端会传systemCode为APP)
+     *
+     * @author lipf
+     * @date 2026/4/29 11:27
+     */
     @Override
     public Authentication authenticate(Authentication authentication) throws AuthenticationException {
         // 获取用户名和密码
@@ -101,8 +114,8 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         String type = ((JzgUsernamePasswordAuthenticationToken)authentication).getType();
         String code = ((JzgUsernamePasswordAuthenticationToken)authentication).getCode();
         boolean appLogin = ((JzgUsernamePasswordAuthenticationToken)authentication).isAppLogin();
-        log.info("登录认证:username=[{}],rawPassword=[{}],details=[{}],system=[{}], captchaId=[{}], captcha=[{}],type=[{}],code=[{}],appLogin=[{}]",
-                username,rawPassword,details,system, captchaId, captcha, type, code, appLogin);
+        log.info("登录认证:username=[{}],details=[{}],system=[{}], captchaId=[{}], captcha=[{}],type=[{}],code=[{}],appLogin=[{}]",
+                username,details,system, captchaId, captcha, type, code, appLogin);
         boolean isFirst = false;
         //调试时注销验证码
         //验证码校验
@@ -135,7 +148,12 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
             }
             salt = weblogUser.getSalt();
         }
-
+        // modify by lipf, 用户所属租户如果被禁用,不能登录
+        HttpResult<List<SysTennatVo>> tenants = organizationClient.getTenantList();
+        if(CollectionUtil.isEmpty(tenants.getData())){
+            log.info("用户[{}]所属的租户已经被禁用,无法登录",username);
+            throw new SystemException("用户所属的租户已经被禁用,无法登录");
+        }
         //检验短信验证码
         if(Objects.nonNull(code)){
             String systemSmsCode = redissonClient.getBucket(RedisKeyConstants.SMS_CODE + username).get().toString();
@@ -346,7 +364,11 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         details = detailMap;
 
         Object finalDetails = details;
-        return new UsernamePasswordAuthenticationToken(username, rawPassword, authorities) {{
+        return new UsernamePasswordAuthenticationToken(username, rawPassword, authorities) {
+            @Serial
+            private static final long serialVersionUID = 6103193211327672348L;
+
+            {
             setDetails(finalDetails);
         }};
     }

+ 1 - 1
tenant/organization/src/main/java/com/jzg/organization/controller/UserController.java

@@ -206,7 +206,7 @@ public class UserController extends BaseController {
     }
 
     /**
-     * 获取用户的租户列表
+     * 获取用户的租户列表(状态为启用的租户)
      *
      * @author lipf
      * @date 2026/4/24 18:05

+ 8 - 1
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java

@@ -47,7 +47,14 @@ public interface SysUserJzgInfoMapper extends BaseMapper<SysUserJzgInfo> {
 
     SysUserJzgInfo getUserByMobile(String mobile);
 
-    List<SysTennatVo> getTenantList(String userId);
+    /**
+     * 获取用户的租户列表
+     *
+     * @param userName 表示手机号或者用户登录名
+     * @author lipf
+     * @date 2026/4/29 11:30
+     */
+    List<SysTennatVo> getTenantList(String userName);
 
     SysUserJzgInfo getUserJzgInfoByUserId(String userId);
 

+ 7 - 5
tenant/organization/src/main/java/com/jzg/organization/service/SysUserService.java

@@ -20,7 +20,7 @@ import java.util.List;
 /**
  * @author Administrator
  * @description 针对表【sys_user】的数据库操作Service
- * @createDate 2023-11-15 11:23:28
+ * @date 2023-11-15 11:23:28
  */
 public interface SysUserService extends IService<SysUser> {
 
@@ -28,7 +28,7 @@ public interface SysUserService extends IService<SysUser> {
      * 获取人员信息
      *
      * @param sysUserVo
-     * @return
+     * @return List<SysUserVo>
      */
     List<SysUserVo> getUserInfo(SysUserVo sysUserVo);
 
@@ -162,11 +162,13 @@ public interface SysUserService extends IService<SysUser> {
     AuditCountVo getAuditCount(SysUserInfoParam sysUserInfoParam);
 
     /**
-     * 获取用户租户列表
+     * 获取用户的租户列表(状态为启用的租户)
      *
-     * @return userId 用户序号(sys_user 表的序号)
+     * @param userName 用户名或手机号
+     * @author lipf
+     * @date 2026/4/29 11:34
      */
-    List<SysTennatVo> getTenantList(String userId);
+    List<SysTennatVo> getTenantList(String userName);
 
     /**
      * 校验短信验证码

+ 29 - 6
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDeptServiceImpl.java

@@ -1,6 +1,6 @@
 package com.jzg.organization.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.core.base.BaseController;
@@ -17,6 +17,8 @@ import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.commons.entity.vo.SysDeptVo;
 import com.jzg.organization.mapper.SysDeptMapper;
 import com.jzg.organization.service.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -28,6 +30,8 @@ import java.util.stream.Collectors;
 @Service
 public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> implements SysDeptService {
 
+    private static final Logger log = LoggerFactory.getLogger(SysDeptServiceImpl.class);
+
     @Autowired
     private SysDeptMapper sysDeptMapper;
 
@@ -46,15 +50,24 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
     @Autowired
     SysUserJzgInfoService sysUserJzgInfoService;
 
-    private void validateDept(SysDeptVo sysDeptVo,boolean isAdd){
+    /**
+     * 校验租户下机构的唯一性
+     *
+     * @param systemCode 租户代码
+     * @author lipf
+     * @date 2026/4/29 11:58
+     */
+    private void validateDept(SysDeptVo sysDeptVo,boolean isAdd, String systemCode){
         if(isAdd){
             if(this.count(new LambdaQueryWrapper<SysDept>()
-                    .eq(SysDept::getName, sysDeptVo.getName())) > 0){
+                    .eq(SysDept::getName, sysDeptVo.getName())
+                    .eq(SysDept::getSystemCode, systemCode)) > 0){
                 throw new SystemException("机构名称已存在");
             }
         }else{
             if(this.count(new LambdaQueryWrapper<SysDept>()
                .eq(SysDept::getName, sysDeptVo.getName())
+                    .eq(SysDept::getSystemCode, systemCode)
                .ne(SysDept::getId, sysDeptVo.getId())) > 0){
                 throw new SystemException("机构名称已存在");
            }
@@ -62,10 +75,19 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 
     }
 
+    /**
+     * 租户下新增部门
+     *
+     * @author lipf
+     * @date 2026/4/29 11:56
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean addDept(SysDeptVo sysDeptVo) {
-        validateDept(sysDeptVo,true);
+        String userName = baseController.getUserName();
+        String systemCode = baseController.getSystemCode();
+        log.info("租户[{}]下的用户[{}]新增部门.部门信息[{}]", systemCode, userName, JSONUtil.toJsonStr(sysDeptVo));
+        validateDept(sysDeptVo,true,systemCode);
 
         SysDept sysDept = new SysDept();
         BeanUtils.copyProperties(sysDeptVo, sysDept);
@@ -115,10 +137,11 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
     @Override
     @Transactional
     public boolean updateDept(SysDeptVo sysDeptVo) {
-        validateDept(sysDeptVo,false);
+        String systemCode = baseController.getSystemCode();
+        log.info("修改租户[{}]下的部门信息[{}]",systemCode, JSONUtil.toJsonStr(sysDeptVo));
+        validateDept(sysDeptVo,false,systemCode);
         sysDeptMapper.updateById(getSysDept(sysDeptVo));
         return true;
-
     }
 
 

+ 6 - 5
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java

@@ -366,17 +366,18 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     }
 
     /**
-     * 获取用户的租户列表
+     * 获取用户的租户列表(状态为启用的租户)
      *
+     * @param userName 表示手机号或者用户登录名
      * @author lipf
      * @date 2026/4/24 18:05
      */
     @Override
-    public List<SysTennatVo> getTenantList(String userId) {
-        log.info("获取用户的租户列表:userId=[{}]", userId);
+    public List<SysTennatVo> getTenantList(String userName) {
+        log.info("获取用户的租户列表:userId=[{}]", userName);
         // 租户id
-        String systemCode = (String) redissonClient.getBucket(RedisKeyConstants.APP_SYSTEM_CODE + userId).get();
-        List<SysTennatVo> tenantList = sysUserJzgInfoMapper.getTenantList(userId);
+        String systemCode = (String) redissonClient.getBucket(RedisKeyConstants.APP_SYSTEM_CODE + userName).get();
+        List<SysTennatVo> tenantList = sysUserJzgInfoMapper.getTenantList(userName);
         tenantList.forEach(item -> {
             String presignedObjectUrl = MinioUtils.getPresignedObjectUrl(bucketName, item.getSysIcon());
             item.setIconAddress(presignedObjectUrl);

+ 1 - 1
tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -308,7 +308,7 @@
                 LEFT JOIN sys_dept sd ON sd.id = suji.dept_id
                 LEFT JOIN sys_upload_files suf on suf.id = ss.sys_icon
         WHERE
-            ( mobile = #{userId} OR username = #{userId})
+            ( mobile = #{userName} OR username = #{userName})
         AND suji.system_code != 'APP'
         AND suji.is_enable = 0
     </select>