Commit 956bb1ede1c1c4a3a813114ecb986c6ea233fefe
1 parent
39427775
fix: 已完成租户管理员增加的用户为客户,同时创建客户管理员并激活客户管理员
Showing
1 changed file
with
121 additions
and
61 deletions
... | ... | @@ -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 | } | ... | ... |