Commit 956bb1ede1c1c4a3a813114ecb986c6ea233fefe

Authored by 黄 x
1 parent 39427775

fix: 已完成租户管理员增加的用户为客户,同时创建客户管理员并激活客户管理员

... ... @@ -12,11 +12,14 @@ import org.springframework.security.access.prepost.PreAuthorize;
12 12 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
13 13 import org.springframework.validation.annotation.Validated;
14 14 import org.springframework.web.bind.annotation.*;
15   -import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
  15 +import org.thingsboard.server.common.data.Customer;
  16 +import org.thingsboard.server.common.data.EntityType;
16 17 import org.thingsboard.server.common.data.User;
17 18 import org.thingsboard.server.common.data.audit.ActionType;
18 19 import org.thingsboard.server.common.data.edge.EdgeEventActionType;
19 20 import org.thingsboard.server.common.data.exception.ThingsboardException;
  21 +import org.thingsboard.server.common.data.id.CustomerId;
  22 +import org.thingsboard.server.common.data.id.EntityId;
20 23 import org.thingsboard.server.common.data.id.TenantId;
21 24 import org.thingsboard.server.common.data.id.UserId;
22 25 import org.thingsboard.server.common.data.security.Authority;
... ... @@ -43,12 +46,10 @@ import org.thingsboard.server.dao.user.UserService;
43 46 import org.thingsboard.server.dao.yunteng.service.YtUserService;
44 47 import org.thingsboard.server.service.security.model.SecurityUser;
45 48 import org.thingsboard.server.service.security.permission.Operation;
  49 +import org.thingsboard.server.service.security.permission.Resource;
46 50 import org.thingsboard.server.service.security.system.SystemSecurityService;
47   -
48   -import javax.servlet.http.HttpServletRequest;
49 51 import javax.servlet.http.HttpServletResponse;
50 52 import java.io.IOException;
51   -import java.net.URI;
52 53 import java.util.HashMap;
53 54 import java.util.List;
54 55 import java.util.UUID;
... ... @@ -105,7 +106,7 @@ public class YtUserController extends BaseController {
105 106 queryMap.put("username", username);
106 107 if (null != roleType && roleType.equals(RoleEnum.TENANT_ADMIN)) {
107 108 queryMap.put("roleType", roleType.name());
108   - }else{
  109 + } else {
109 110 tenantId = getCurrentUser().getCurrentTenantId();
110 111 }
111 112 if (orderType != null) {
... ... @@ -116,7 +117,8 @@ public class YtUserController extends BaseController {
116 117 queryMap,
117 118 getCurrentUser().isPtSysadmin(),
118 119 getCurrentUser().isPtAdmin(),
119   - getCurrentUser().isPtTenantAdmin(),tenantId);
  120 + getCurrentUser().isPtTenantAdmin(),
  121 + tenantId);
120 122 }
121 123
122 124 @PutMapping
... ... @@ -126,19 +128,25 @@ public class YtUserController extends BaseController {
126 128 }
127 129
128 130 @PostMapping
129   - @PreAuthorize("hasAnyAuthority('SYS_ADMIN','PLATFORM_ADMIN','TENANT_ADMIN')")
  131 + @PreAuthorize("hasAnyAuthority('SYS_ADMIN','TENANT_ADMIN')")
130 132 public ResponseEntity<UserDTO> addUser(
131 133 @RequestParam(value = "sendEmail", required = false, defaultValue = "false")
132 134 boolean sendEmail,
133 135 @RequestParam(value = "sendMsg", required = false, defaultValue = "false") boolean sendMsg,
134 136 @Validated({AddGroup.class}) @RequestBody UserDTO userDTO)
135 137 throws ThingsboardException {
136   - //如果当前用户是租户管理员,则代表创建的用户为CUSTOMER_USER,则需要调用TB,否则为本平台的管理员不需要调用TB
  138 + // 如果当前用户是租户管理员,则代表创建的用户为CUSTOMER_USER,则需要调用TB,否则为本平台的管理员不需要调用TB
137 139 boolean isTenantAdminOperator = getCurrentUser().isPtTenantAdmin();
138   - if(isTenantAdminOperator){
139   -
  140 + if (isTenantAdminOperator) {
  141 + // 创建CUSTOMER_USER用户
  142 + Customer customer = createCustomer(userDTO.getUsername());
  143 + // 创建CUSTOMER_USER的管理员
  144 + User tbUser = createTBUser(userDTO,customer.getTenantId(),customer.getId(), Authority.CUSTOMER_USER);
  145 + // 激活CUSTOMER_USER的管理员
  146 + activeTBUser(tbUser.getId());
140 147 }
141   - return ResponseEntity.ok(userService.saveAccount(
  148 + return ResponseEntity.ok(
  149 + userService.saveAccount(
142 150 userDTO,
143 151 sendEmail,
144 152 sendMsg,
... ... @@ -146,7 +154,7 @@ public class YtUserController extends BaseController {
146 154 getCurrentUser().getCurrentTenantId()));
147 155 }
148 156
149   - @PreAuthorize("hasAnyAuthority('SYS_ADMIN','PLATFORM_ADMIN')")
  157 + @PreAuthorize("hasAnyAuthority('SYS_ADMIN')")
150 158 @PostMapping("saveTenantAdmin")
151 159 public UserDTO saveTenantAdmin(@Validated(AddGroup.class) @RequestBody UserDTO userDTO)
152 160 throws ThingsboardException {
... ... @@ -157,38 +165,10 @@ public class YtUserController extends BaseController {
157 165 TenantId tenantId = new TenantId(UUID.fromString(userDTO.getTenantId()));
158 166 try {
159 167 // 创建TB的租户管理员
160   - User tbUser = new User();
161   - tbUser.setAuthority(Authority.TENANT_ADMIN);
162   - tbUser.setTenantId(tenantId);
163   - tbUser.setEmail(userDTO.getUsername() + FastIotConstants.DEFAULT_EMAIL_SUFFIX_FOR_TB);
164   - tbUser = tbUserService.saveUser(tbUser);
165   - userDTO.setTbUser(tbUser.getId().getId().toString());
166   - logEntityAction(
167   - tbUser.getId(),
168   - tbUser,
169   - tbUser.getCustomerId(),
170   - userDTO.getId() == null ? ActionType.ADDED : ActionType.UPDATED,
171   - null);
172   - sendEntityNotificationMsg(
173   - tenantId,
174   - tbUser.getId(),
175   - userDTO.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED);
176   -
  168 + CustomerId customerId = new CustomerId(EntityId.NULL_UUID);
  169 + User tbUser = createTBUser(userDTO, tenantId,customerId, Authority.TENANT_ADMIN);
177 170 // 激活租户管理员
178   - // 1、获取UserCredentials 并获取activateToken
179   - UserId userId = tbUser.getId();
180   - User user = checkUserId(userId, Operation.READ);
181   - SecurityUser authUser = getCurrentUser();
182   - UserCredentials userCredentials =
183   - tbUserService.findUserCredentialsByUserId(authUser.getTenantId(), user.getId());
184   - // 2、进行激活
185   - String encodedPassword = passwordEncoder.encode(FastIotConstants.DEFAULT_PWD);
186   - UserCredentials credentials =
187   - tbUserService.activateUserCredentials(
188   - TenantId.SYS_TENANT_ID, userCredentials.getActivateToken(), encodedPassword);
189   - User currentUser =
190   - tbUserService.findUserById(TenantId.SYS_TENANT_ID, credentials.getUserId());
191   - tbUserService.setUserCredentialsEnabled(currentUser.getTenantId(), currentUser.getId(), true);
  171 + activeTBUser(tbUser.getId());
192 172 } catch (Exception e) {
193 173 throw handleException(e);
194 174 }
... ... @@ -199,21 +179,10 @@ public class YtUserController extends BaseController {
199 179 @DeleteMapping
200 180 public void deleteUser(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO)
201 181 throws ThingsboardException {
202   - //如果当前用户是租户管理员,则代表创建的用户为CUSTOMER_USER,则需要调用TB,否则为本平台的管理员不需要调用TB
  182 + // 如果当前用户是租户管理员,则代表创建的用户为CUSTOMER_USER,则需要调用TB,否则为本平台的管理员不需要调用TB
203 183 userService.deleteUser(
204 184 deleteDTO.getIds(), getCurrentUser().isPtSysadmin(), getCurrentUser().getCurrentTenantId());
205 185 }
206   -
207   - @RequestMapping(
208   - value = "/{userId}/activationLink",
209   - method = RequestMethod.GET,
210   - produces = "text/plain")
211   - public String getActivationLink(
212   - @PathVariable("userId") String strUserId, HttpServletRequest request) {
213   -
214   - return null;
215   - }
216   -
217 186 @GetMapping("getGroupUserByGroupId/{groupId}")
218 187 public ResponseEntity<List<UserDTO>> getGroupUserByGroupId(
219 188 @PathVariable("groupId") String groupId) throws ThingsboardException {
... ... @@ -253,22 +222,113 @@ public class YtUserController extends BaseController {
253 222 org.thingsboard.server.dao.yunteng.entities.User user =
254 223 userService.validateChangePasswordAccount(accountReqDTO);
255 224 String resetPassword = accountReqDTO.getResetPassword();
256   - if(!getCurrentUser().isPtAdmin()){
257   - try{
  225 + if (!getCurrentUser().isPtAdmin()) {
  226 + try {
258 227 // 除开平台管理员,都要调用TB密码修改
259 228 SecurityUser securityUser = getCurrentUser();
260 229 UserCredentials userCredentials =
261   - tbUserService.findUserCredentialsByUserId(TenantId.SYS_TENANT_ID, securityUser.getId());
262   - systemSecurityService.validatePassword(securityUser.getTenantId(), resetPassword, userCredentials);
  230 + tbUserService.findUserCredentialsByUserId(TenantId.SYS_TENANT_ID, securityUser.getId());
  231 + systemSecurityService.validatePassword(
  232 + securityUser.getTenantId(), resetPassword, userCredentials);
263 233 userCredentials.setPassword(passwordEncoder.encode(resetPassword));
264 234 tbUserService.replaceUserCredentials(securityUser.getTenantId(), userCredentials);
265 235 sendEntityNotificationMsg(
266   - getTenantId(), userCredentials.getUserId(), EdgeEventActionType.CREDENTIALS_UPDATED);
  236 + getTenantId(), userCredentials.getUserId(), EdgeEventActionType.CREDENTIALS_UPDATED);
267 237 eventPublisher.publishEvent(new UserAuthDataChangedEvent(securityUser.getId()));
268   - }catch (Exception e){
  238 + } catch (Exception e) {
269 239 throw handleException(e);
270 240 }
271 241 }
272 242 return ResponseResult.success(userService.changePassword(user));
273 243 }
  244 +
  245 + /**
  246 + * 创建租户用户
  247 + *
  248 + * @param title 标题
  249 + * @throws ThingsboardException tb运行异常
  250 + */
  251 + private Customer createCustomer(String title) throws ThingsboardException {
  252 + Customer customer = new Customer();
  253 + try {
  254 + customer.setTitle(title);
  255 + customer.setTenantId(getCurrentUser().getTenantId());
  256 + checkEntity(customer.getId(), customer, Resource.CUSTOMER);
  257 +
  258 + Customer savedCustomer = checkNotNull(customerService.saveCustomer(customer));
  259 +
  260 + logEntityAction(
  261 + savedCustomer.getId(), savedCustomer, savedCustomer.getId(), ActionType.ADDED, null);
  262 +
  263 + if (customer.getId() != null) {
  264 + sendEntityNotificationMsg(
  265 + savedCustomer.getTenantId(), savedCustomer.getId(), EdgeEventActionType.UPDATED);
  266 + }
  267 + return savedCustomer;
  268 + } catch (Exception e) {
  269 + logEntityAction(emptyId(EntityType.CUSTOMER), customer, null, ActionType.ADDED, e);
  270 + throw handleException(e);
  271 + }
  272 + }
  273 +
  274 + /**
  275 + * 激活用户
  276 + *
  277 + * @param userId 用户ID
  278 + * @throws ThingsboardException tb运行异常
  279 + */
  280 + private void activeTBUser(UserId userId) throws ThingsboardException {
  281 + try {
  282 + // 1、获取UserCredentials 并获取activateToken
  283 + User user = checkUserId(userId, Operation.READ);
  284 + SecurityUser authUser = getCurrentUser();
  285 + UserCredentials userCredentials =
  286 + tbUserService.findUserCredentialsByUserId(authUser.getTenantId(), user.getId());
  287 + // 2、进行激活
  288 + String encodedPassword = passwordEncoder.encode(FastIotConstants.DEFAULT_PWD);
  289 + UserCredentials credentials =
  290 + tbUserService.activateUserCredentials(
  291 + TenantId.SYS_TENANT_ID, userCredentials.getActivateToken(), encodedPassword);
  292 + User currentUser =
  293 + tbUserService.findUserById(TenantId.SYS_TENANT_ID, credentials.getUserId());
  294 + tbUserService.setUserCredentialsEnabled(currentUser.getTenantId(), currentUser.getId(), true);
  295 + } catch (Exception e) {
  296 + throw handleException(e);
  297 + }
  298 + }
  299 +
  300 + /**
  301 + * 创建TB的用户
  302 + * @param userDTO 基础用户信息
  303 + * @param authority 用户角色权限
  304 + * @param tenantId 租户ID
  305 + * @param customerId 客户ID
  306 + * @return 用户
  307 + * @throws ThingsboardException tb运行异常
  308 + */
  309 + private User createTBUser(UserDTO userDTO, TenantId tenantId, CustomerId customerId, Authority authority)
  310 + throws ThingsboardException {
  311 + try {
  312 + User tbUser = new User();
  313 + tbUser.setAuthority(authority);
  314 + tbUser.setTenantId(tenantId);
  315 + tbUser.setCustomerId(customerId);
  316 + tbUser.setEmail(userDTO.getUsername() + FastIotConstants.DEFAULT_EMAIL_SUFFIX_FOR_TB);
  317 + tbUser = tbUserService.saveUser(tbUser);
  318 + userDTO.setTbUser(tbUser.getId().getId().toString());
  319 + logEntityAction(
  320 + tbUser.getId(),
  321 + tbUser,
  322 + tbUser.getCustomerId(),
  323 + userDTO.getId() == null ? ActionType.ADDED : ActionType.UPDATED,
  324 + null);
  325 + sendEntityNotificationMsg(
  326 + tenantId,
  327 + tbUser.getId(),
  328 + userDTO.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED);
  329 + return tbUser;
  330 + } catch (Exception e) {
  331 + throw handleException(e);
  332 + }
  333 + }
274 334 }
... ...