Commit c445361b73a61bb1c4fb70c6b40b6f74ba438ed2

Authored by 黄 x
1 parent 0f0840eb

fix: 修改系统管理员、平台管理员、租户管理员创建用户的BUG,剩余调用TB工作及平台管理员登录

... ... @@ -126,25 +126,24 @@ public class YtUserController extends BaseController {
126 126 }
127 127
128 128 @PostMapping
  129 + @PreAuthorize("hasAnyAuthority('SYS_ADMIN','PLATFORM_ADMIN','TENANT_ADMIN')")
129 130 public ResponseEntity<UserDTO> addUser(
130 131 @RequestParam(value = "sendEmail", required = false, defaultValue = "false")
131 132 boolean sendEmail,
132 133 @RequestParam(value = "sendMsg", required = false, defaultValue = "false") boolean sendMsg,
133 134 @Validated({AddGroup.class}) @RequestBody UserDTO userDTO)
134 135 throws ThingsboardException {
135   - UserDTO newUserDTO =
136   - userService.saveAccount(
  136 + //如果当前用户是租户管理员,则代表创建的用户为CUSTOMER_USER,则需要调用TB,否则为本平台的管理员不需要调用TB
  137 + boolean isTenantAdminOperator = getCurrentUser().isPtTenantAdmin();
  138 + if(isTenantAdminOperator){
  139 +
  140 + }
  141 + return ResponseEntity.ok(userService.saveAccount(
137 142 userDTO,
138 143 sendEmail,
139 144 sendMsg,
140 145 getCurrentUser().isPtSysadmin(),
141   - getCurrentUser().getCurrentTenantId());
142   - URI location =
143   - ServletUriComponentsBuilder.fromCurrentRequest()
144   - .path("{id}")
145   - .buildAndExpand(newUserDTO.getId())
146   - .toUri();
147   - return ResponseEntity.created(location).body(newUserDTO);
  146 + getCurrentUser().getCurrentTenantId()));
148 147 }
149 148
150 149 @PreAuthorize("hasAnyAuthority('SYS_ADMIN','PLATFORM_ADMIN')")
... ... @@ -200,6 +199,7 @@ public class YtUserController extends BaseController {
200 199 @DeleteMapping
201 200 public void deleteUser(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO)
202 201 throws ThingsboardException {
  202 + //如果当前用户是租户管理员,则代表创建的用户为CUSTOMER_USER,则需要调用TB,否则为本平台的管理员不需要调用TB
203 203 userService.deleteUser(
204 204 deleteDTO.getIds(), getCurrentUser().isPtSysadmin(), getCurrentUser().getCurrentTenantId());
205 205 }
... ...
... ... @@ -41,13 +41,13 @@ public interface FastIotConstants {
41 41 public static final int IS_ADMIN=0;
42 42
43 43 /** 系统平台其他管理员 */
44   - public static final int IS_OTHER_ADMIN = 1;
  44 + public static final int IS_PLATFORM_ADMIN = 1;
45 45
46 46 /** 租户管理员 */
47 47 public static final int IS_TENANT_ADMIN = 2;
48 48
49   - /** 普通用户 */
50   - public static final int IS_NORMAL = 3;
  49 + /** 租户下的用户 */
  50 + public static final int IS_CUSTOMER_USER = 3;
51 51 }
52 52
53 53 interface CacheConfigKey {
... ...
1 1 package org.thingsboard.server.dao.yunteng.impl;
  2 +
2 3 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
3 5 import lombok.RequiredArgsConstructor;
4 6 import lombok.extern.slf4j.Slf4j;
5 7 import org.apache.commons.lang3.ObjectUtils;
  8 +import org.apache.commons.lang3.StringUtils;
6 9 import org.springframework.stereotype.Service;
  10 +import org.springframework.transaction.annotation.Transactional;
  11 +import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException;
  12 +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
7 13 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO;
8 14 import org.thingsboard.server.dao.yunteng.entities.UserOrganizationMapping;
9 15 import org.thingsboard.server.dao.yunteng.mapper.OrganizationMapper;
... ... @@ -28,12 +34,9 @@ public class UserOrganizationMappingServiceImpl implements UserOrganizationMappi
28 34 private final OrganizationMapper organizationMapper;
29 35
30 36 @Override
31   - public List<String> getUserIdByOrganizationIds(String tenantId,String... ids) {
  37 + public List<String> getUserIdByOrganizationIds(String tenantId, String... ids) {
32 38 List<String> collect =
33   - organizationMapper
34   - .findOrganizationTreeList(
35   - tenantId, List.of(ids))
36   - .stream()
  39 + organizationMapper.findOrganizationTreeList(tenantId, List.of(ids)).stream()
37 40 .map(OrganizationDTO::getId)
38 41 .collect(Collectors.toList());
39 42 if (ObjectUtils.isEmpty(collect)) {
... ... @@ -48,4 +51,60 @@ public class UserOrganizationMappingServiceImpl implements UserOrganizationMappi
48 51 .collect(Collectors.toList());
49 52 }
50 53 }
  54 +
  55 + @Override
  56 + @Transactional
  57 + public void addOrUpdateUserOrganizationMapping(
  58 + String userId, List<String> organizationIds, boolean isUpdate) {
  59 + if (StringUtils.isAllEmpty(userId) || null == organizationIds || organizationIds.size() < 1) {
  60 + throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
  61 + }
  62 + if (isUpdate) {
  63 + // 先删除,再新增
  64 + userOrganizationMappingMapper.delete(
  65 + new LambdaQueryWrapper<UserOrganizationMapping>()
  66 + .eq(UserOrganizationMapping::getUserId, userId));
  67 + }
  68 + batchInsert(userId, organizationIds);
  69 + }
  70 +
  71 + @Override
  72 + public List<String> getUserIdsByOrganizationId(String organizationId) {
  73 + if (StringUtils.isAllEmpty(organizationId)) {
  74 + throw new YtDataValidationException(ErrorMessage.INTERNAL_ERROR.getMessage());
  75 + }
  76 + return userOrganizationMappingMapper
  77 + .selectList(
  78 + new QueryWrapper<UserOrganizationMapping>()
  79 + .lambda()
  80 + .eq(UserOrganizationMapping::getOrganizationId, organizationId))
  81 + .stream()
  82 + .map(UserOrganizationMapping::getUserId)
  83 + .collect(Collectors.toList());
  84 + }
  85 +
  86 + @Override
  87 + public List<String> getOrganizationIdsByUserId(String userId) {
  88 + if (StringUtils.isAllEmpty(userId)) {
  89 + throw new YtDataValidationException(ErrorMessage.INTERNAL_ERROR.getMessage());
  90 + }
  91 + return userOrganizationMappingMapper
  92 + .selectList(
  93 + new QueryWrapper<UserOrganizationMapping>()
  94 + .lambda()
  95 + .eq(UserOrganizationMapping::getUserId, userId))
  96 + .stream()
  97 + .map(UserOrganizationMapping::getOrganizationId)
  98 + .collect(Collectors.toList());
  99 + }
  100 +
  101 + private void batchInsert(String userId, List<String> organizationIds) {
  102 + organizationIds.forEach(
  103 + organizationId -> {
  104 + UserOrganizationMapping userOrganizationMapping = new UserOrganizationMapping();
  105 + userOrganizationMapping.setUserId(userId);
  106 + userOrganizationMapping.setOrganizationId(organizationId);
  107 + userOrganizationMappingMapper.insert(userOrganizationMapping);
  108 + });
  109 + }
51 110 }
... ...
... ... @@ -209,7 +209,7 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev
209 209
210 210 device.setAlarmStatus(0);
211 211 /** 默认待激活状态 */
212   - device.setDeviceState(DeviceState.INACTIVE);
  212 + device.setDeviceState(DeviceState.INACTIVE.name());
213 213 baseMapper.insert(device);
214 214 return device.getDTO(DeviceDTO.class);
215 215 }
... ...
... ... @@ -55,13 +55,13 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
55 55 private final TenantMapper tenantMapper;
56 56 private final RoleMapper roleMapper;
57 57 private final OrganizationMapper organizationMapper;
58   - private final UserOrganizationMappingMapper userOrganizationMappingMapper;
59 58 private final UserRoleMapper userRoleMapper;
60 59 private final TenantRoleMapper tenantRoleMapper;
61 60
62 61 private final YtSmsService ytSmsService;
63 62 private final YtMessageTemplateService messageTemplateService;
64   - private final YtOrganizationService groupService;
  63 + private final YtOrganizationService organizationService;
  64 + private final UserOrganizationMappingService userOrganizationMappingService;
65 65
66 66 public static final String ACTIVATE_URL_PATTERN = "%s/api/noauth/activate?activateToken=%s";
67 67 private final PasswordEncoder passwordEncoder;
... ... @@ -75,8 +75,8 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
75 75 @Override
76 76 @Transactional
77 77 public UserDTO saveAccount(
78   - UserDTO userDTO, boolean sendEmail, boolean sendMsg, boolean isPtSysadmin, String tenantId) {
79   - boolean isAdminOperate = isPtSysadmin;
  78 + UserDTO userDTO, boolean sendEmail, boolean sendMsg, boolean isTenantAdmin, String tenantId) {
  79 + boolean isTenantAdminOperate = isTenantAdmin;
80 80 if (sendMsg && StringUtils.isAllBlank(userDTO.getPhoneNumber())) {
81 81 throw new YtDataValidationException(
82 82 "you must specify user phone number if you want send activate email to this user");
... ... @@ -91,43 +91,22 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
91 91 if (StringUtils.isNotBlank(userDTO.getPassword())) {
92 92 user.setPassword(passwordEncoder.encode(userDTO.getPassword()));
93 93 }
94   - if (isAdminOperate) {
95   - // 添加的租户管理员
96   - if (StringUtils.isNotBlank(userDTO.getTenantId())) {
97   - user.setTenantId(userDTO.getTenantId());
98   - user.setPassword(passwordEncoder.encode(FastIotConstants.DEFAULT_PWD));
99   - int tenantExist =
100   - tenantMapper.selectCount(
101   - new QueryWrapper<Tenant>().lambda().eq(Tenant::getTenantId, userDTO.getTenantId()));
102   - if (tenantExist == 0) {
103   - throw new YtDataValidationException("tenant must exist");
104   - }
105   - } else {
106   - // 添加的平台系统其他用户
107   - user.setLevel(FastIotConstants.LevelValue.IS_OTHER_ADMIN);
108   - user.setTenantId(tenantId);
109   - }
110   - userExist =
111   - baseMapper.selectCount(
112   - new QueryWrapper<User>()
113   - .lambda()
114   - .eq(User::getUsername, userDTO.getUsername())
115   - .eq(User::getTenantId, userDTO.getTenantId()))
116   - > 0;
117   - } else {
118   - user.setLevel(FastIotConstants.LevelValue.IS_NORMAL);
119   - user.setTenantId(tenantId);
120   - userExist =
121   - baseMapper.selectCount(
122   - new QueryWrapper<User>()
123   - .lambda()
124   - .eq(User::getUsername, userDTO.getUsername())
125   - .eq(User::getTenantId, tenantId))
126   - > 0;
127   - }
  94 + userExist =
  95 + baseMapper.selectCount(
  96 + new QueryWrapper<User>()
  97 + .lambda()
  98 + .eq(User::getUsername, userDTO.getUsername())
  99 + .eq(User::getTenantId, tenantId))
  100 + > 0;
128 101 if (userExist) {
129 102 throw new YtDataValidationException(ErrorMessage.NAME_ALREADY_EXISTS.getMessage());
130 103 } else {
  104 + user.setPassword(passwordEncoder.encode(FastIotConstants.DEFAULT_PWD));
  105 + user.setTenantId(tenantId);
  106 + user.setLevel(
  107 + isTenantAdminOperate
  108 + ? FastIotConstants.LevelValue.IS_CUSTOMER_USER
  109 + : FastIotConstants.LevelValue.IS_PLATFORM_ADMIN);
131 110 baseMapper.insert(user);
132 111 for (String roleId : userDTO.getRoleIds()) {
133 112 // 添加用户角色信息
... ... @@ -137,7 +116,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
137 116 userRoleMapper.insert(userRole);
138 117 }
139 118 // 绑定用户和组织的关系
140   - groupService.bindUserToOrganization(tenantId, user.getId(), userDTO.getOrganizationIds());
  119 + organizationService.bindUserToOrganization(tenantId, user.getId(), userDTO.getOrganizationIds());
141 120 user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);
142 121 return userDTO;
143 122 }
... ... @@ -145,10 +124,10 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
145 124
146 125 @Override
147 126 public void validateUserNameAndPhoneNumberAndEmail(UserDTO userDTO) {
148   - if(null == userDTO.getId()){
  127 + if (null == userDTO.getId()) {
149 128 User existUser =
150   - baseMapper.selectOne(
151   - new LambdaQueryWrapper<User>().eq(User::getUsername, userDTO.getUsername()));
  129 + baseMapper.selectOne(
  130 + new LambdaQueryWrapper<User>().eq(User::getUsername, userDTO.getUsername()));
152 131 if (null != existUser) {
153 132 throw new YtDataValidationException(ErrorMessage.USER_NAME_ALREADY_EXISTS.getMessage());
154 133 }
... ... @@ -171,7 +150,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
171 150
172 151 @Override
173 152 public UserDTO findUserInfoById(String id) {
174   - if(StringUtils.isEmpty(id)){
  153 + if (StringUtils.isEmpty(id)) {
175 154 throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
176 155 }
177 156 return baseMapper.selectById(id).getDTO(UserDTO.class);
... ... @@ -264,6 +243,8 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
264 243 }
265 244 baseMapper.updateById(user);
266 245 deleteAndAddUserRole(user.getId(), Arrays.asList(userDTO.getRoleIds()));
  246 + userOrganizationMappingService.addOrUpdateUserOrganizationMapping(
  247 + user.getId(), Arrays.asList(userDTO.getOrganizationIds()), true);
267 248 user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);
268 249 return userDTO;
269 250 }
... ... @@ -282,7 +263,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
282 263 if (StringUtils.isEmpty(roleType)) {
283 264 roleType = RoleEnum.PLATFORM_ADMIN.name();
284 265 userPage = baseMapper.getAdminUserPage(userIPage, tenantId, roleType);
285   - }else{
  266 + } else {
286 267 userPage = baseMapper.getTenantAdminPage(userIPage, tenantId);
287 268 }
288 269 } else if (isPlatformAdmin) {
... ... @@ -344,7 +325,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
344 325
345 326 // 3. 解绑人员对应的group
346 327
347   - groupService.unBindUserToOrganization(userIds);
  328 + organizationService.unBindUserToOrganization(userIds);
348 329
349 330 // 4. 删除人员
350 331 baseMapper.deleteBatchIds(userIds);
... ... @@ -445,15 +426,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
445 426 if (group == null || !group.getTenantId().equals(tenantId)) {
446 427 return Optional.empty();
447 428 }
448   - Set<String> userIds =
449   - userOrganizationMappingMapper
450   - .selectList(
451   - new QueryWrapper<UserOrganizationMapping>()
452   - .lambda()
453   - .eq(UserOrganizationMapping::getOrganizationId, group))
454   - .stream()
455   - .map(UserOrganizationMapping::getUserId)
456   - .collect(Collectors.toSet());
  429 + List<String> userIds = userOrganizationMappingService.getUserIdsByOrganizationId(group.getId());
457 430 List<User> users = baseMapper.selectBatchIds(userIds);
458 431 return Optional.ofNullable(ReflectUtils.sourceToTarget(users, UserDTO.class));
459 432 }
... ... @@ -474,16 +447,9 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
474 447 return roleIds.toArray(new String[roleIds.size()]);
475 448 }
476 449 if (roleOrGroupReqDTO.isQueryOrganization()) {
477   - List<String> roleIds =
478   - userOrganizationMappingMapper
479   - .selectList(
480   - new QueryWrapper<UserOrganizationMapping>()
481   - .lambda()
482   - .eq(UserOrganizationMapping::getUserId, userId))
483   - .stream()
484   - .map(UserOrganizationMapping::getOrganizationId)
485   - .collect(Collectors.toList());
486   - return roleIds.toArray(new String[roleIds.size()]);
  450 + List<String> organizationIds =
  451 + userOrganizationMappingService.getOrganizationIdsByUserId(userId);
  452 + return organizationIds.toArray(new String[organizationIds.size()]);
487 453 }
488 454 return null;
489 455 }
... ... @@ -512,8 +478,8 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
512 478 public User validateChangePasswordAccount(AccountReqDTO accountReqDTO) {
513 479 User user = baseMapper.selectById(accountReqDTO.getUserId());
514 480 if (null == user
515   - || StringUtils.isEmpty(accountReqDTO.getPassword())
516   - || StringUtils.isEmpty(accountReqDTO.getResetPassword())) {
  481 + || StringUtils.isEmpty(accountReqDTO.getPassword())
  482 + || StringUtils.isEmpty(accountReqDTO.getResetPassword())) {
517 483 throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
518 484 }
519 485 // 判断用户密码是否正确
... ... @@ -527,19 +493,21 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
527 493
528 494 /**
529 495 * 先删除用户与角色的关系,再添加新的关系
  496 + *
530 497 * @param userId 用户ID
531 498 * @param roleIds 角色ID
532 499 */
533   - private void deleteAndAddUserRole(String userId,List<String> roleIds){
534   - if(StringUtils.isAllEmpty(userId) || null == roleIds || roleIds.size()<1){
  500 + private void deleteAndAddUserRole(String userId, List<String> roleIds) {
  501 + if (StringUtils.isAllEmpty(userId) || null == roleIds || roleIds.size() < 1) {
535 502 throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
536 503 }
537   - //先删除用户与角色的关系,再添加用户与角色的关系
  504 + // 先删除用户与角色的关系,再添加用户与角色的关系
538 505 List<String> userIds = new ArrayList<>();
539 506 userIds.add(userId);
540 507 roleMapper.deleteRoleUserMappingByUserIds(userIds);
541   - roleIds.forEach(role ->{
542   - roleMapper.saveUserRoleMapping(userId,role);
543   - });
  508 + roleIds.forEach(
  509 + role -> {
  510 + roleMapper.saveUserRoleMapping(userId, role);
  511 + });
544 512 }
545 513 }
... ...
1 1 package org.thingsboard.server.dao.yunteng.service;
2 2
3 3 import java.util.List;
  4 +import java.util.Set;
4 5
5 6 /**
6 7 * @author: 徐浩然
... ... @@ -9,5 +10,31 @@ import java.util.List;
9 10 */
10 11 public interface UserOrganizationMappingService {
11 12
12   - List<String> getUserIdByOrganizationIds(String tenantId,String... ids);
  13 + List<String> getUserIdByOrganizationIds(String tenantId, String... ids);
  14 +
  15 + /**
  16 + * 添加或更新用户组织关系
  17 + *
  18 + * @param userId 用户ID
  19 + * @param organizationIds 组织列表
  20 + * @param isUpdate true更新 false新增
  21 + */
  22 + void addOrUpdateUserOrganizationMapping(
  23 + String userId, List<String> organizationIds, boolean isUpdate);
  24 +
  25 + /**
  26 + * 根据组织ID查询其用户ID列表
  27 + *
  28 + * @param organizationId 组织ID
  29 + * @return 用户ID集合
  30 + */
  31 + List<String> getUserIdsByOrganizationId(String organizationId);
  32 +
  33 + /**
  34 + * 根据用户ID查询其所拥有的组织ID列表
  35 + *
  36 + * @param userId 用户ID
  37 + * @return 组织ID集合
  38 + */
  39 + List<String> getOrganizationIdsByUserId(String userId);
13 40 }
... ...
... ... @@ -17,7 +17,7 @@ import java.util.Set;
17 17 public interface YtUserService {
18 18 List<UserDetailsDTO> findUserDetailsByUsername(String username);
19 19
20   - UserDTO saveAccount(UserDTO userDTO, boolean sendEmail, boolean sendMsg,boolean isPtSysadmin,String tenantId);
  20 + UserDTO saveAccount(UserDTO userDTO, boolean sendEmail, boolean sendMsg,boolean isTenantAdmin,String tenantId);
21 21
22 22 String getActivationLink(String userId,boolean isPtSysadmin,String tenantId);
23 23
... ...