|
30 | 30 | import datart.core.data.provider.Dataframe; |
31 | 31 | import datart.core.entity.*; |
32 | 32 | import datart.core.mappers.ext.ShareMapperExt; |
| 33 | +import datart.core.mappers.ext.UserMapperExt; |
| 34 | +import datart.security.base.PasswordToken; |
33 | 35 | import datart.security.base.ResourceType; |
34 | 36 | import datart.security.exception.PermissionDeniedException; |
35 | 37 | import datart.security.util.AESUtil; |
@@ -63,16 +65,20 @@ public class ShareServiceImpl extends BaseService implements ShareService { |
63 | 65 |
|
64 | 66 | private final RoleService roleService; |
65 | 67 |
|
| 68 | + private final UserMapperExt userMapperExt; |
| 69 | + |
66 | 70 | public ShareServiceImpl(DataProviderService dataProviderService, |
67 | 71 | VizService vizService, |
68 | 72 | DownloadService downloadService, |
69 | 73 | ShareMapperExt shareMapper, |
70 | | - RoleService roleService) { |
| 74 | + RoleService roleService, |
| 75 | + UserMapperExt userMapperExt) { |
71 | 76 | this.dataProviderService = dataProviderService; |
72 | 77 | this.vizService = vizService; |
73 | 78 | this.downloadService = downloadService; |
74 | 79 | this.shareMapper = shareMapper; |
75 | 80 | this.roleService = roleService; |
| 81 | + this.userMapperExt = userMapperExt; |
76 | 82 | } |
77 | 83 |
|
78 | 84 | @Override |
@@ -353,28 +359,47 @@ private void authenticationShare(Share share, ShareToken shareToken) { |
353 | 359 | } |
354 | 360 | break; |
355 | 361 | case LOGIN: |
| 362 | + |
| 363 | + // 验证用户是否存在 |
| 364 | + User user = null; |
356 | 365 | if (StringUtils.isBlank(shareToken.getUsername())) { |
357 | 366 | try { |
358 | | - User currentUser = getSecurityManager().getCurrentUser(); |
359 | | - if (currentUser != null) { |
360 | | - shareToken.setUsername(currentUser.getUsername()); |
361 | | - return; |
| 367 | + user = getSecurityManager().getCurrentUser(); |
| 368 | + if (user != null) { |
| 369 | + shareToken.setUsername(user.getUsername()); |
| 370 | + shareToken.setPassword(user.getPassword()); |
362 | 371 | } else { |
363 | 372 | Exceptions.tr(BaseException.class, "message.share.permission.denied"); |
364 | 373 | } |
365 | 374 | } catch (Exception ignored) { |
366 | 375 | Exceptions.tr(BaseException.class, "message.share.permission.denied"); |
367 | 376 | } |
| 377 | + } else { |
| 378 | + user = userMapperExt.selectByNameOrEmail(shareToken.getUsername()); |
| 379 | + } |
| 380 | + if (user == null) { |
| 381 | + Exceptions.tr(BaseException.class, "message.user.not.exists"); |
| 382 | + } |
| 383 | + // 验证用户是否具有访问权限 |
| 384 | + if (ShareRowPermissionBy.CREATOR.name().equals(share.getRowPermissionBy())) { |
| 385 | + return; |
368 | 386 | } |
369 | | - if (!getSecurityManager().validateUser(shareToken.getUsername(), shareToken.getPassword())) { |
| 387 | + getSecurityManager().login(new PasswordToken(shareToken.getUsername(), shareToken.getPassword(), System.currentTimeMillis())); |
| 388 | + if (getSecurityManager().isOrgOwner(share.getOrgId())) { |
| 389 | + return; |
| 390 | + } |
| 391 | + try { |
| 392 | + checkVizReadPermission(ResourceType.valueOf(share.getVizType()), share.getVizId()); |
| 393 | + return; |
| 394 | + } catch (PermissionDeniedException e) { |
370 | 395 | Exceptions.tr(BaseException.class, "message.share.permission.denied"); |
371 | 396 | } |
372 | 397 | if (StringUtils.isBlank(shareToken.getUsername()) |
373 | 398 | || StringUtils.isBlank(shareToken.getUsername()) |
374 | 399 | || StringUtils.isBlank(share.getRoles())) { |
375 | 400 | Exceptions.tr(BaseException.class, "message.share.permission.denied"); |
376 | 401 | } |
377 | | - List<Role> roles = roleService.listUserRoles(share.getOrgId(), shareToken.getUsername()); |
| 402 | + List<Role> roles = roleService.listUserRoles(share.getOrgId(), user.getId()); |
378 | 403 | if (CollectionUtils.isEmpty(roles)) { |
379 | 404 | Exceptions.tr(BaseException.class, "message.share.permission.denied"); |
380 | 405 | } |
@@ -409,6 +434,21 @@ private void validateShareParam(ShareCreateParam createParam) { |
409 | 434 | } |
410 | 435 | } |
411 | 436 |
|
| 437 | + private void checkVizReadPermission(ResourceType vizType, String vizId) { |
| 438 | + switch (vizType) { |
| 439 | + case DASHBOARD: |
| 440 | + retrieve(vizId, Dashboard.class, true); |
| 441 | + break; |
| 442 | + case DATACHART: |
| 443 | + retrieve(vizId, Datachart.class, true); |
| 444 | + break; |
| 445 | + case STORYBOARD: |
| 446 | + retrieve(vizId, Storyboard.class, true); |
| 447 | + default: |
| 448 | + Exceptions.tr(BaseException.class, "message.share.unsupported", vizType.name()); |
| 449 | + } |
| 450 | + } |
| 451 | + |
412 | 452 | private ShareAuthorizedToken parseToken(ShareToken shareToken) { |
413 | 453 | ShareAuthorizedToken authorizedToken = null; |
414 | 454 | if (StringUtils.isBlank(shareToken.getAuthorizedToken())) { |
|
0 commit comments