From 6c8ccb38649796220348bc73d4257c2f7086ff94 Mon Sep 17 00:00:00 2001 From: lijiahang Date: Wed, 20 Sep 2023 18:23:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=80=BB=E8=BE=91.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/SecurityFrameworkService.java | 8 ++ .../SecurityFrameworkServiceDelegate.java | 5 ++ ...on-vue-views-components-form-drawer.vue.vm | 2 + .../asset/controller/HostKeyController.java | 2 +- .../request/host/HostKeyUpdateRequest.java | 3 + .../service/impl/HostKeyServiceImpl.java | 16 +++- .../impl/SecurityFrameworkServiceImpl.java | 6 ++ .../infra/service/PermissionService.java | 8 ++ .../service/impl/PermissionServiceImpl.java | 52 +++++++++--- orion-ops-ui/src/api/asset/host-key.ts | 1 + .../components/host-key-form-drawer.vue | 83 ++++++++++++++++--- .../host-key/components/host-key-table.vue | 13 +-- .../src/views/asset/host-key/index.vue | 9 +- .../asset/host-key/types/table.columns.ts | 2 +- .../views/asset/host/types/table.columns.ts | 3 - .../menu/components/menu-form-modal.vue | 4 +- 16 files changed, 176 insertions(+), 41 deletions(-) diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-security/src/main/java/com/orion/ops/framework/security/core/service/SecurityFrameworkService.java b/orion-ops-framework/orion-ops-spring-boot-starter-security/src/main/java/com/orion/ops/framework/security/core/service/SecurityFrameworkService.java index 79df6196..3b66cc7d 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-security/src/main/java/com/orion/ops/framework/security/core/service/SecurityFrameworkService.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-security/src/main/java/com/orion/ops/framework/security/core/service/SecurityFrameworkService.java @@ -23,6 +23,14 @@ public interface SecurityFrameworkService { */ boolean hasPermission(String permission); + /** + * 检查是否有任意权限 + * + * @param permissions 权限 + * @return has + */ + boolean hasAnyPermission(String... permissions); + /** * 检查是否有角色 * diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-security/src/main/java/com/orion/ops/framework/security/core/service/SecurityFrameworkServiceDelegate.java b/orion-ops-framework/orion-ops-spring-boot-starter-security/src/main/java/com/orion/ops/framework/security/core/service/SecurityFrameworkServiceDelegate.java index a3ea20ea..af8432e0 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-security/src/main/java/com/orion/ops/framework/security/core/service/SecurityFrameworkServiceDelegate.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-security/src/main/java/com/orion/ops/framework/security/core/service/SecurityFrameworkServiceDelegate.java @@ -22,6 +22,11 @@ public class SecurityFrameworkServiceDelegate implements SecurityFrameworkServic return delegate.hasPermission(permission); } + @Override + public boolean hasAnyPermission(String... permissions) { + return delegate.hasAnyPermission(permissions); + } + @Override public boolean hasRole(String role) { return delegate.hasRole(role); diff --git a/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm b/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm index d262866f..2aff129b 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm @@ -4,6 +4,8 @@ :width="430" :mask-closable="false" :unmount-on-close="true" + :ok-button-props="{ disabled: loading }" + :cancel-button-props="{ disabled: loading }" :on-before-ok="handlerOk" @cancel="handleClose"> diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostKeyController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostKeyController.java index e8b97f21..0454709c 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostKeyController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostKeyController.java @@ -58,7 +58,7 @@ public class HostKeyController { @GetMapping("/get") @Operation(summary = "查询主机秘钥详情") @Parameter(name = "id", description = "id", required = true) - @PreAuthorize("@ss.hasPermission('asset:host-key:detail')") + @PreAuthorize("@ss.hasAnyPermission('asset:host-key:detail', 'asset:host-key:update')") public HostKeyVO getHostKey(@RequestParam("id") Long id) { return hostKeyService.getHostKeyById(id); } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostKeyUpdateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostKeyUpdateRequest.java index 75334cf6..9ce99ac5 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostKeyUpdateRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostKeyUpdateRequest.java @@ -47,4 +47,7 @@ public class HostKeyUpdateRequest implements Serializable { @Schema(description = "密码") private String password; + @Schema(description = "是否使用新密码") + private Boolean useNewPassword; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostKeyServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostKeyServiceImpl.java index 66ccfe22..cba4b17c 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostKeyServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostKeyServiceImpl.java @@ -3,6 +3,7 @@ package com.orion.ops.module.asset.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.orion.lang.define.wrapper.DataGrid; +import com.orion.lang.utils.Booleans; import com.orion.lang.utils.Strings; import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.common.constant.ErrorMessage; @@ -72,9 +73,16 @@ public class HostKeyServiceImpl implements HostKeyService { HostKeyDO updateRecord = HostKeyConvert.MAPPER.to(request); // 查询数据是否冲突 this.checkHostKeyPresent(updateRecord); - String password = updateRecord.getPassword(); - if (!Strings.isBlank(password)) { - updateRecord.setPassword(CryptoUtils.encryptAsString(password)); + if (Booleans.isTrue(request.getUseNewPassword())) { + // 使用新密码 + String password = updateRecord.getPassword(); + if (Strings.isBlank(password)) { + updateRecord.setPassword(Const.EMPTY); + } else { + updateRecord.setPassword(CryptoUtils.encryptAsString(password)); + } + } else { + updateRecord.setPassword(null); } // 更新 int effect = hostKeyDAO.updateById(updateRecord); @@ -101,7 +109,7 @@ public class HostKeyServiceImpl implements HostKeyService { HostKeyDO record = hostKeyDAO.selectById(id); Valid.notNull(record, ErrorMessage.DATA_ABSENT); String password = record.getPassword(); - if (password != null) { + if (!Strings.isBlank(password)) { record.setPassword(CryptoUtils.decryptAsString(password)); } return record; diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/framework/service/impl/SecurityFrameworkServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/framework/service/impl/SecurityFrameworkServiceImpl.java index aae41f06..76bcfc85 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/framework/service/impl/SecurityFrameworkServiceImpl.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/framework/service/impl/SecurityFrameworkServiceImpl.java @@ -36,6 +36,12 @@ public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { return permissionService.hasPermission(permission); } + @Override + public boolean hasAnyPermission(String... permissions) { + // 检查是否有权限 + return permissionService.hasAnyPermission(permissions); + } + @Override public boolean hasRole(String role) { // 检查是否有角色 diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/PermissionService.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/PermissionService.java index 3c782c5a..975b559b 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/PermissionService.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/PermissionService.java @@ -59,6 +59,14 @@ public interface PermissionService { */ boolean hasPermission(String permission); + /** + * 检查当前用户是否含任意权限 (有效性判断) + * + * @param permissions permissions + * @return 是否包含 + */ + boolean hasAnyPermission(String... permissions); + /** * 获取用户菜单 * diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PermissionServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PermissionServiceImpl.java index 7eb9c8f8..41a55629 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PermissionServiceImpl.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PermissionServiceImpl.java @@ -1,5 +1,6 @@ package com.orion.ops.module.infra.service.impl; +import com.orion.lang.utils.Arrays1; import com.orion.lang.utils.collect.Lists; import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.common.security.LoginUser; @@ -129,17 +130,25 @@ public class PermissionServiceImpl implements PermissionService { return true; } // 检查普通角色是否有此权限 - for (String role : roles) { - // 获取角色权限列表 - List menus = roleMenuCache.get(role); - if (Lists.isEmpty(menus)) { - continue; - } - boolean has = menus.stream() - .filter(s -> MenuStatusEnum.ENABLED.getStatus().equals(s.getStatus())) - .map(SystemMenuCacheDTO::getPermission) - .filter(Objects::nonNull) - .anyMatch(permission::equals); + return roles.stream().anyMatch(s -> this.checkRoleHasPermission(s, permission)); + } + + @Override + public boolean hasAnyPermission(String... permissions) { + if (Arrays1.isEmpty(permissions)) { + return true; + } + // 获取用户角色 + List roles = this.getUserEnabledRoles(); + if (roles.isEmpty()) { + return false; + } + // 检查是否为超级管理员 + if (RoleDefine.containsAdmin(roles)) { + return true; + } + for (String permission : permissions) { + final boolean has = roles.stream().anyMatch(s -> this.checkRoleHasPermission(s, permission)); if (has) { return true; } @@ -212,6 +221,27 @@ public class PermissionServiceImpl implements PermissionService { .build(); } + /** + * 检查角色是否有权限 + * + * @param role role + * @param permission permission + * @return 是否有权限 + */ + private boolean checkRoleHasPermission(String role, String permission) { + // 获取角色权限列表 + List menus = roleMenuCache.get(role); + if (Lists.isEmpty(menus)) { + return false; + } + // 检查是否有此权限 + return menus.stream() + .filter(s -> MenuStatusEnum.ENABLED.getStatus().equals(s.getStatus())) + .map(SystemMenuCacheDTO::getPermission) + .filter(Objects::nonNull) + .anyMatch(permission::equals); + } + /** * 获取用户启用的角色 * diff --git a/orion-ops-ui/src/api/asset/host-key.ts b/orion-ops-ui/src/api/asset/host-key.ts index 792daf71..81e76318 100644 --- a/orion-ops-ui/src/api/asset/host-key.ts +++ b/orion-ops-ui/src/api/asset/host-key.ts @@ -9,6 +9,7 @@ export interface HostKeyCreateRequest { publicKey?: string; privateKey?: string; password?: string; + useNewPassword?: boolean; } /** diff --git a/orion-ops-ui/src/views/asset/host-key/components/host-key-form-drawer.vue b/orion-ops-ui/src/views/asset/host-key/components/host-key-form-drawer.vue index 37d4fdb6..15022941 100644 --- a/orion-ops-ui/src/views/asset/host-key/components/host-key-form-drawer.vue +++ b/orion-ops-ui/src/views/asset/host-key/components/host-key-form-drawer.vue @@ -1,13 +1,18 @@