Commit 2e6ddb3efbdfff37418036f0ba48b3433ce4a76a

Authored by xp.Huang
1 parent 4c8f4b37

fix: [DEFECT-1541]租户、租户管理员的启用禁用,已登录的租户或租户管理员在禁用后,需重新登录。不能继续操作其他页面

@@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.id.TenantId; @@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.id.TenantId;
23 import org.thingsboard.server.common.data.id.UserId; 23 import org.thingsboard.server.common.data.id.UserId;
24 import org.thingsboard.server.common.data.query.TsValue; 24 import org.thingsboard.server.common.data.query.TsValue;
25 import org.thingsboard.server.common.data.security.UserCredentials; 25 import org.thingsboard.server.common.data.security.UserCredentials;
  26 +import org.thingsboard.server.common.data.security.event.UserAuthDataChangedEvent;
26 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; 27 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
27 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; 28 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
28 import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils; 29 import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils;
@@ -740,6 +741,31 @@ public class SysUserServiceImpl extends AbstractBaseService<UserMapper, SysUserE @@ -740,6 +741,31 @@ public class SysUserServiceImpl extends AbstractBaseService<UserMapper, SysUserE
740 return user; 741 return user;
741 } 742 }
742 743
  744 + @Override
  745 + public void updateTenantAdminUserCredentials(
  746 + List<UserId> ids,
  747 + String currentTenantId,
  748 + boolean userCredentialsEnabled,
  749 + boolean needUpdateStatus) {
  750 + TenantId tenantId = new TenantId(UUID.fromString(currentTenantId));
  751 + for (UserId id : ids) {
  752 + tbUserService.setUserCredentialsEnabled(tenantId, id, userCredentialsEnabled);
  753 + eventPublisher.publishEvent(new UserAuthDataChangedEvent(id));
  754 + // 更新租户管理员的状态
  755 + if (needUpdateStatus) {
  756 + SysUserEntity entity =
  757 + baseMapper.selectOne(
  758 + new LambdaQueryWrapper<SysUserEntity>()
  759 + .eq(SysUserEntity::getTenantId, currentTenantId)
  760 + .eq(SysUserEntity::getTbUser, id.getId().toString()));
  761 + if (null != entity) {
  762 + entity.setEnabled(userCredentialsEnabled);
  763 + baseMapper.updateById(entity);
  764 + }
  765 + }
  766 + }
  767 + }
  768 +
743 private void checkPassword(AccountReqDTO accountReqDTO, SysUserEntity user) { 769 private void checkPassword(AccountReqDTO accountReqDTO, SysUserEntity user) {
744 if (null == user 770 if (null == user
745 || StringUtils.isEmpty(accountReqDTO.getPassword()) 771 || StringUtils.isEmpty(accountReqDTO.getPassword())
@@ -13,10 +13,12 @@ import org.springframework.scheduling.annotation.Async; @@ -13,10 +13,12 @@ import org.springframework.scheduling.annotation.Async;
13 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
14 import org.springframework.transaction.annotation.Transactional; 14 import org.springframework.transaction.annotation.Transactional;
15 import org.thingsboard.server.common.data.id.EntityId; 15 import org.thingsboard.server.common.data.id.EntityId;
  16 +import org.thingsboard.server.common.data.id.UserId;
16 import org.thingsboard.server.common.data.query.TsValue; 17 import org.thingsboard.server.common.data.query.TsValue;
17 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; 18 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
18 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; 19 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
19 import org.thingsboard.server.common.data.yunteng.dto.TenantDTO; 20 import org.thingsboard.server.common.data.yunteng.dto.TenantDTO;
  21 +import org.thingsboard.server.common.data.yunteng.dto.UserDTO;
20 import org.thingsboard.server.common.data.yunteng.dto.request.TenantReqDTO; 22 import org.thingsboard.server.common.data.yunteng.dto.request.TenantReqDTO;
21 import org.thingsboard.server.common.data.yunteng.enums.TenantStatusEnum; 23 import org.thingsboard.server.common.data.yunteng.enums.TenantStatusEnum;
22 import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; 24 import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils;
@@ -60,6 +62,7 @@ public class TkTenantServiceImpl extends AbstractBaseService<TenantMapper, SysTe @@ -60,6 +62,7 @@ public class TkTenantServiceImpl extends AbstractBaseService<TenantMapper, SysTe
60 private final SysEnterpriseService sysEnterpriseService; 62 private final SysEnterpriseService sysEnterpriseService;
61 private final UserRoleMapper userRoleMapper; 63 private final UserRoleMapper userRoleMapper;
62 private final TkDeviceProfileService tkDeviceProfileService; 64 private final TkDeviceProfileService tkDeviceProfileService;
  65 + private final TkUserService tkUserService;
63 66
64 @Override 67 @Override
65 @Transactional 68 @Transactional
@@ -276,16 +279,28 @@ public class TkTenantServiceImpl extends AbstractBaseService<TenantMapper, SysTe @@ -276,16 +279,28 @@ public class TkTenantServiceImpl extends AbstractBaseService<TenantMapper, SysTe
276 if (!tenantReqDTO.getTenantProfileId().isNullUid()) { 279 if (!tenantReqDTO.getTenantProfileId().isNullUid()) {
277 tenant.setTenantProfileId(tenantReqDTO.getTenantProfileId().getId().toString()); 280 tenant.setTenantProfileId(tenantReqDTO.getTenantProfileId().getId().toString());
278 } 281 }
  282 + String tenantId = tenantReqDTO.getTenantId();
279 // update tenant role 283 // update tenant role
280 // delete 284 // delete
281 Set<String> tenantIds = new HashSet<>(); 285 Set<String> tenantIds = new HashSet<>();
282 - tenantIds.add(tenantReqDTO.getTenantId()); 286 + tenantIds.add(tenantId);
283 freshTenantAdminRole(tenantIds, Arrays.asList(tenantReqDTO.getRoleIds())); 287 freshTenantAdminRole(tenantIds, Arrays.asList(tenantReqDTO.getRoleIds()));
284 deleteTenantRolesByTenantId(tenantIds); 288 deleteTenantRolesByTenantId(tenantIds);
285 deleteTenantMenusByTenantId(tenantIds); 289 deleteTenantMenusByTenantId(tenantIds);
286 // add 290 // add
287 - saveTenantMapping(tenantReqDTO.getTenantId(), tenantReqDTO.getRoleIds()); 291 + saveTenantMapping(tenantId, tenantReqDTO.getRoleIds());
288 baseMapper.updateById(tenant); 292 baseMapper.updateById(tenant);
  293 +
  294 + //查询所有的租户管理员,并设置租户管理员的凭证
  295 + List<UserDTO> list = tkUserService.findAllTenantAdminsByTenantId(tenantId);
  296 + if(null != list && !list.isEmpty()){
  297 + List<UserId> tbList = new ArrayList<>();
  298 + for (UserDTO userDTO: list){
  299 + UserId userId = new UserId(UUID.fromString(userDTO.getTbUser()));
  300 + tbList.add(userId);
  301 + }
  302 + tkUserService.updateTenantAdminUserCredentials(tbList,tenantId,tenantReqDTO.isEnabled(),true);
  303 + }
289 } 304 }
290 return tenant.getDTO(TenantDTO.class); 305 return tenant.getDTO(TenantDTO.class);
291 } 306 }
1 package org.thingsboard.server.dao.yunteng.service; 1 package org.thingsboard.server.dao.yunteng.service;
2 2
  3 +import org.thingsboard.server.common.data.id.UserId;
3 import org.thingsboard.server.common.data.query.TsValue; 4 import org.thingsboard.server.common.data.query.TsValue;
4 import org.thingsboard.server.common.data.yunteng.dto.UserDTO; 5 import org.thingsboard.server.common.data.yunteng.dto.UserDTO;
5 import org.thingsboard.server.common.data.yunteng.dto.UserDetailsDTO; 6 import org.thingsboard.server.common.data.yunteng.dto.UserDetailsDTO;
@@ -19,7 +20,7 @@ import java.util.Set; @@ -19,7 +20,7 @@ import java.util.Set;
19 import java.util.concurrent.CompletableFuture; 20 import java.util.concurrent.CompletableFuture;
20 21
21 public interface TkUserService { 22 public interface TkUserService {
22 - List<UserDetailsDTO> findUserDetailsByUsername(String username,String tenantId); 23 + List<UserDetailsDTO> findUserDetailsByUsername(String username, String tenantId);
23 24
24 UserDTO saveAccount( 25 UserDTO saveAccount(
25 UserDTO userDTO, boolean sendEmail, boolean sendMsg, boolean isTenantAdmin, String tenantId); 26 UserDTO userDTO, boolean sendEmail, boolean sendMsg, boolean isTenantAdmin, String tenantId);
@@ -31,9 +32,8 @@ public interface TkUserService { @@ -31,9 +32,8 @@ public interface TkUserService {
31 UserInfoDTO me(String userId, String tenantId, Set<String> currentRoles); 32 UserInfoDTO me(String userId, String tenantId, Set<String> currentRoles);
32 33
33 TkPageData<UserDTO> page( 34 TkPageData<UserDTO> page(
34 - Map<String, Object> queryMap,  
35 - boolean isPtSysadmin,  
36 - boolean isTenantAdmin); 35 + Map<String, Object> queryMap, boolean isPtSysadmin, boolean isTenantAdmin);
  36 +
37 TkPageData<UserDTO> tenantPage(Map<String, Object> queryMap, String tenantId); 37 TkPageData<UserDTO> tenantPage(Map<String, Object> queryMap, String tenantId);
38 38
39 UserDTO updateUser(UserDTO userDTO, boolean isPtSysadmin, String tenantId); 39 UserDTO updateUser(UserDTO userDTO, boolean isPtSysadmin, String tenantId);
@@ -42,9 +42,9 @@ public interface TkUserService { @@ -42,9 +42,9 @@ public interface TkUserService {
42 42
43 UserDTO saveTenantAdmin(UserDTO userDTO, boolean isPtSysadmin, String tenantId); 43 UserDTO saveTenantAdmin(UserDTO userDTO, boolean isPtSysadmin, String tenantId);
44 44
45 - void resetPassword(String userId, String tenantId,String password); 45 + void resetPassword(String userId, String tenantId, String password);
46 46
47 - void forgetPassword(String phoneNumber,AccountReqDTO forget); 47 + void forgetPassword(String phoneNumber, AccountReqDTO forget);
48 48
49 List<UserDetailsDTO> getUserByPhoneNumber(String phoneNumber); 49 List<UserDetailsDTO> getUserByPhoneNumber(String phoneNumber);
50 50
@@ -52,6 +52,7 @@ public interface TkUserService { @@ -52,6 +52,7 @@ public interface TkUserService {
52 52
53 /** 53 /**
54 * 验证租户角色是否有效 54 * 验证租户角色是否有效
  55 + *
55 * @param tenantId 56 * @param tenantId
56 */ 57 */
57 List<SysTenantRoleEntity> validateTenantRole(String tenantId); 58 List<SysTenantRoleEntity> validateTenantRole(String tenantId);
@@ -62,7 +63,7 @@ public interface TkUserService { @@ -62,7 +63,7 @@ public interface TkUserService {
62 * 63 *
63 * @param msg 请求信息 64 * @param msg 请求信息
64 */ 65 */
65 - void sendRestPasswordMsg(String tenantId,SendResetPasswordEmailMsg msg); 66 + void sendRestPasswordMsg(String tenantId, SendResetPasswordEmailMsg msg);
66 67
67 /** 68 /**
68 * 判断账号是否注册过 69 * 判断账号是否注册过
@@ -74,6 +75,7 @@ public interface TkUserService { @@ -74,6 +75,7 @@ public interface TkUserService {
74 75
75 /** 76 /**
76 * 判断电话是否注册过 77 * 判断电话是否注册过
  78 + *
77 * @param phoneNumber 手机号 79 * @param phoneNumber 手机号
78 * @return 80 * @return
79 */ 81 */
@@ -110,6 +112,7 @@ public interface TkUserService { @@ -110,6 +112,7 @@ public interface TkUserService {
110 112
111 /** 113 /**
112 * 修改个人中心 114 * 修改个人中心
  115 + *
113 * @param userDTO 修改信息 116 * @param userDTO 修改信息
114 * @return 修改后的信息 117 * @return 修改后的信息
115 */ 118 */
@@ -117,35 +120,50 @@ public interface TkUserService { @@ -117,35 +120,50 @@ public interface TkUserService {
117 120
118 /** 121 /**
119 * 获取当前用户的客户 122 * 获取当前用户的客户
  123 + *
120 * @param organizationId 组织ID 124 * @param organizationId 组织ID
121 * @param tenantId 用户ID 125 * @param tenantId 用户ID
122 * @param isTenantAdmin 是否是租户管理员 126 * @param isTenantAdmin 是否是租户管理员
123 * @return 租户创建的所有用户 127 * @return 租户创建的所有用户
124 */ 128 */
125 - List<UserDTO> getMyCustomers(String organizationId,String tenantId,boolean isTenantAdmin); 129 + List<UserDTO> getMyCustomers(String organizationId, String tenantId, boolean isTenantAdmin);
126 130
127 /** 131 /**
128 * 异步获取用户列表 132 * 异步获取用户列表
  133 + *
129 * @param startTs 开始时间 134 * @param startTs 开始时间
130 * @param endTs 结束时间 135 * @param endTs 结束时间
131 * @param ts 时间 136 * @param ts 时间
132 * @return 客户信息 137 * @return 客户信息
133 */ 138 */
134 - CompletableFuture<TsValue> findUsersAsyncByTs(LocalDateTime startTs, LocalDateTime endTs, long ts); 139 + CompletableFuture<TsValue> findUsersAsyncByTs(
  140 + LocalDateTime startTs, LocalDateTime endTs, long ts);
135 141
136 /** 142 /**
137 * 检查账号是否存在 143 * 检查账号是否存在
  144 + *
138 * @param userId 用户ID 145 * @param userId 用户ID
139 * @param level 级别:0:超级管理员;1:平台管理员;2:租户账号;3:租户下的账号 146 * @param level 级别:0:超级管理员;1:平台管理员;2:租户账号;3:租户下的账号
140 * @return true 存在 false 不存在 147 * @return true 存在 false 不存在
141 */ 148 */
142 - UserDTO checkAccount(String userId,Integer level); 149 + UserDTO checkAccount(String userId, Integer level);
143 150
144 /** 151 /**
145 * 根据租户ID查询所有的租户管理员 152 * 根据租户ID查询所有的租户管理员
  153 + *
146 * @param tenantId 租户ID 154 * @param tenantId 租户ID
147 * @return 租户管理员列表 155 * @return 租户管理员列表
148 */ 156 */
149 List<UserDTO> findAllTenantAdminsByTenantId(String tenantId); 157 List<UserDTO> findAllTenantAdminsByTenantId(String tenantId);
150 158
  159 + /**
  160 + * 更新租户管理员的用户凭证
  161 + *
  162 + * @param ids TB用户ID
  163 + * @param currentTenantId 租户ID
  164 + * @param userCredentialsEnabled 用户凭证的启用禁用
  165 + * @param needUpdateStatus 是否需要更新租户管理员的状态
  166 + */
  167 + void updateTenantAdminUserCredentials(
  168 + List<UserId> ids, String currentTenantId, boolean userCredentialsEnabled,boolean needUpdateStatus);
151 } 169 }