diff --git a/README.md b/README.md index d3fa2c11..3916c286 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- Downloads + Downloads Build Status Build Status Coverage Status @@ -37,39 +37,44 @@ |----------------------|------------| | Java | 17+ | | NodeJS | 18+ | -| Spring | 6.2.11 | -| Spring Boot | 3.5.6 | -| Spring Cloud | 2025.0.0 | -| Spring Cloud Alibaba | 2023.0.3.3 | -| Nacos Alibaba | 3.1.0 | +| Spring | 6.2.15 | +| Spring Boot | 3.5.9 | +| Spring Cloud | 2025.0.1 | +| Spring Cloud Alibaba | 2025.0.0.0 | +| Nacos Alibaba | 3.1.1 | | Mybatis Plus | 3.5.19 | ## 工程结构 ``` SpringBlade -├── blade-auth -- 授权服务提供 -├── blade-common -- 常用工具封装包 -├── blade-gateway -- Spring Cloud 网关 -├── blade-ops -- 运维中心 -├ ├── blade-admin -- spring-cloud后台管理 -├ ├── blade-develop -- 代码生成 -├ ├── blade-report -- 报表模块 -├ ├── blade-resource -- 资源模块 -├ ├── blade-seata-order -- seata分布式事务demo -├ ├── blade-seata-storage -- seata分布式事务demo -├── blade-service -- 业务模块 -├ ├── blade-demo -- 示例模块 -├ ├── blade-desk -- 工作台模块 -├ ├── blade-log -- 日志模块 -├ └── blade-system -- 系统模块 -├── blade-service-api -- 业务模块api封装 -├ ├── blade-demo-api -- 示例api -├ ├── blade-desk-api -- 工作台api -├ ├── blade-dict-api -- 字典api -├ ├── blade-scope-api -- 权限api -├ ├── blade-system-api -- 系统api -└── └── blade-user-api -- 用户api +├── src/main/java/org/springblade +│ ├── Application.java -- 启动类 +│ ├── common -- 公共模块 +│ │ ├── cache -- 缓存配置 +│ │ ├── config -- 系统配置 +│ │ ├── constant -- 常量定义 +│ │ ├── launch -- 启动配置 +│ │ └── tool -- 工具类 +│ ├── core -- 核心模块 +│ │ ├── log -- 日志拓展 +│ │ └── secure -- 安全拓展 +│ └── modules -- 业务模块 +│ ├── auth -- 认证授权模块 +│ ├── desk -- 工作台模块 +│ ├── develop -- 代码生成模块 +│ ├── resource -- 资源管理模块 +│ └── system -- 系统管理模块 +├── src/main/resources +│ ├── application.yml -- 主配置文件 +│ ├── application-dev.yml -- 开发环境配置 +│ ├── application-test.yml -- 测试环境配置 +│ ├── application-prod.yml -- 生产环境配置 +│ └── config -- 其他配置文件 +├── doc -- 文档目录 +│ ├── script -- 启动脚本 +│ └── sql -- 数据库脚本 +└── pom.xml -- Maven配置文件 ``` ## 官方信息 diff --git a/blade-common/src/main/java/org/springblade/common/constant/CommonConstant.java b/blade-common/src/main/java/org/springblade/common/constant/CommonConstant.java index 698604fa..0c859e62 100644 --- a/blade-common/src/main/java/org/springblade/common/constant/CommonConstant.java +++ b/blade-common/src/main/java/org/springblade/common/constant/CommonConstant.java @@ -33,4 +33,14 @@ public interface CommonConstant { */ String DEFAULT_PASSWORD = "123456"; + /** + * 数据权限类型 + */ + Integer DATA_SCOPE_CATEGORY = 1; + + /** + * 接口权限类型 + */ + Integer API_SCOPE_CATEGORY = 2; + } diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/DatasourceController.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/DatasourceController.java index 4677ac66..d9966a58 100644 --- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/DatasourceController.java +++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/DatasourceController.java @@ -24,7 +24,9 @@ import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.constant.RoleConstant; import org.springblade.core.tool.utils.Func; import org.springblade.develop.entity.Datasource; import org.springblade.develop.service.IDatasourceService; @@ -42,6 +44,7 @@ import java.util.List; @AllArgsConstructor @RequestMapping("/datasource") @Tag(name = "数据源配置表", description = "数据源配置表接口") +@PreAuth(RoleConstant.HAS_ROLE_ADMIN) public class DatasourceController extends BladeController { private IDatasourceService datasourceService; diff --git a/blade-service-api/blade-scope-api/pom.xml b/blade-service-api/blade-scope-api/pom.xml index 3eef2c73..eb72dca4 100644 --- a/blade-service-api/blade-scope-api/pom.xml +++ b/blade-service-api/blade-scope-api/pom.xml @@ -18,6 +18,10 @@ org.springblade blade-core-secure + + org.springblade + blade-starter-cache + org.springblade blade-starter-datascope diff --git a/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/cache/ApiScopeCache.java b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/cache/ApiScopeCache.java new file mode 100644 index 00000000..051cfcd3 --- /dev/null +++ b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/cache/ApiScopeCache.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springblade.system.cache; + +import org.springblade.core.cache.utils.CacheUtil; +import org.springblade.core.tool.utils.SpringUtil; +import org.springblade.core.tool.utils.StringPool; +import org.springblade.system.feign.IApiScopeClient; + +import java.util.List; + +import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; + +/** + * 接口权限缓存 + * + * @author Chill + */ +public class ApiScopeCache { + + private static final String SCOPE_CACHE_ROLE = "apiScope:role:"; + + private static final String SCOPE_CACHE_CODE = "apiScope:code:"; + + private static IApiScopeClient apiScopeClient; + + private static IApiScopeClient getApiScopeClient() { + if (apiScopeClient == null) { + apiScopeClient = SpringUtil.getBean(IApiScopeClient.class); + } + return apiScopeClient; + } + + /** + * 获取接口权限地址 + * + * @param roleId 角色id + * @return permissions + */ + public static List permissionPath(String roleId) { + List permissions = CacheUtil.get(SYS_CACHE, SCOPE_CACHE_ROLE, roleId, List.class); + if (permissions == null) { + permissions = getApiScopeClient().permissionPath(roleId); + CacheUtil.put(SYS_CACHE, SCOPE_CACHE_ROLE, roleId, permissions); + } + return permissions; + } + + /** + * 获取接口权限信息 + * + * @param permission 权限编号 + * @param roleId 角色id + * @return permissions + */ + public static List permissionCode(String permission, String roleId) { + List permissions = CacheUtil.get(SYS_CACHE, SCOPE_CACHE_CODE, permission + StringPool.COLON + roleId, List.class); + if (permissions == null) { + permissions = getApiScopeClient().permissionCode(permission, roleId); + CacheUtil.put(SYS_CACHE, SCOPE_CACHE_CODE, permission + StringPool.COLON + roleId, permissions); + } + return permissions; + } + +} diff --git a/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/cache/DataScopeCache.java b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/cache/DataScopeCache.java index 456423a5..4b62d46c 100644 --- a/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/cache/DataScopeCache.java +++ b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/cache/DataScopeCache.java @@ -15,13 +15,17 @@ */ package org.springblade.system.cache; +import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.datascope.model.DataScopeModel; -import org.springblade.core.tool.utils.*; +import org.springblade.core.tool.utils.CollectionUtil; +import org.springblade.core.tool.utils.SpringUtil; +import org.springblade.core.tool.utils.StringPool; +import org.springblade.core.tool.utils.StringUtil; import org.springblade.system.feign.IDataScopeClient; import java.util.List; -import static org.springblade.core.tool.utils.CacheUtil.SYS_CACHE; +import static org.springblade.core.cache.utils.CacheUtil.SYS_CACHE; /** diff --git a/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/config/ScopeConfiguration.java b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/config/ScopeConfiguration.java index 0b8df115..3550c56f 100644 --- a/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/config/ScopeConfiguration.java +++ b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/config/ScopeConfiguration.java @@ -15,10 +15,11 @@ */ package org.springblade.system.config; - import lombok.AllArgsConstructor; import org.springblade.core.datascope.handler.ScopeModelHandler; import org.springblade.core.secure.config.RegistryConfiguration; +import org.springblade.core.secure.handler.IPermissionHandler; +import org.springblade.system.handler.ApiScopePermissionHandler; import org.springblade.system.handler.DataScopeModelHandler; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.context.annotation.Bean; @@ -39,4 +40,9 @@ public class ScopeConfiguration { return new DataScopeModelHandler(); } + @Bean + public IPermissionHandler permissionHandler() { + return new ApiScopePermissionHandler(); + } + } diff --git a/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/feign/IApiScopeClient.java b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/feign/IApiScopeClient.java new file mode 100644 index 00000000..f51f37e0 --- /dev/null +++ b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/feign/IApiScopeClient.java @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springblade.system.feign; + +import org.springblade.core.launch.constant.AppConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * 接口权限Feign接口类 + * + * @author Chill + */ +@FeignClient(value = AppConstant.APPLICATION_SYSTEM_NAME, fallback = IApiScopeClientFallback.class) +public interface IApiScopeClient { + + String API_PREFIX = "/feign/client/api-scope"; + String PERMISSION_PATH = API_PREFIX + "/permission-path"; + String PERMISSION_CODE = API_PREFIX + "/permission-code"; + + /** + * 获取接口权限地址 + * + * @param roleId 角色id + * @return permissions + */ + @GetMapping(PERMISSION_PATH) + List permissionPath(@RequestParam("roleId") String roleId); + + /** + * 获取接口权限信息 + * + * @param permission 权限编号 + * @param roleId 角色id + * @return permissions + */ + @GetMapping(PERMISSION_CODE) + List permissionCode(@RequestParam("permission") String permission, @RequestParam("roleId") String roleId); + +} diff --git a/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/feign/IApiScopeClientFallback.java b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/feign/IApiScopeClientFallback.java new file mode 100644 index 00000000..7e1e8f8e --- /dev/null +++ b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/feign/IApiScopeClientFallback.java @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springblade.system.feign; + +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * IApiScopeClientFallback + * + * @author Chill + */ +@Component +public class IApiScopeClientFallback implements IApiScopeClient { + @Override + public List permissionPath(String roleId) { + return null; + } + + @Override + public List permissionCode(String permission, String roleId) { + return null; + } +} diff --git a/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/handler/ApiScopePermissionHandler.java b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/handler/ApiScopePermissionHandler.java new file mode 100644 index 00000000..155c677a --- /dev/null +++ b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/handler/ApiScopePermissionHandler.java @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springblade.system.handler; + +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.handler.IPermissionHandler; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.WebUtil; + +import jakarta.servlet.http.HttpServletRequest; + +import java.util.List; + +import static org.springblade.system.cache.ApiScopeCache.*; + +/** + * 接口权限校验类 + * + * @author Chill + */ +public class ApiScopePermissionHandler implements IPermissionHandler { + + @Override + public boolean permissionAll() { + HttpServletRequest request = WebUtil.getRequest(); + BladeUser user = AuthUtil.getUser(); + if (request == null || user == null) { + return false; + } + String uri = request.getRequestURI(); + List paths = permissionPath(user.getRoleId()); + if (paths == null || paths.isEmpty()) { + return false; + } + return paths.stream().anyMatch(uri::contains); + } + + @Override + public boolean hasPermission(String permission) { + HttpServletRequest request = WebUtil.getRequest(); + BladeUser user = AuthUtil.getUser(); + if (request == null || user == null) { + return false; + } + List codes = permissionCode(permission, user.getRoleId()); + return codes != null && !codes.isEmpty(); + } + +} diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/ApiScope.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/ApiScope.java new file mode 100644 index 00000000..4a87ebe2 --- /dev/null +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/ApiScope.java @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springblade.system.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serial; + +/** + * 实体类 + * + * @author BladeX + */ +@Data +@TableName("blade_scope_api") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "ApiScope对象") +public class ApiScope extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 菜单主键 + */ + @Schema(description = "菜单主键") + private Long menuId; + /** + * 资源编号 + */ + @Schema(description = "资源编号") + private String resourceCode; + /** + * 接口权限名称 + */ + @Schema(description = "接口权限名称") + private String scopeName; + /** + * 接口权限字段 + */ + @Schema(description = "接口权限字段") + private String scopePath; + /** + * 接口权限类型 + */ + @Schema(description = "接口权限类型") + private Integer scopeType; + /** + * 接口权限备注 + */ + @Schema(description = "接口权限备注") + private String remark; + + +} diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleScope.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleScope.java index 50af1a54..94028e25 100644 --- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleScope.java +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleScope.java @@ -47,6 +47,12 @@ public class RoleScope implements Serializable { @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; + /** + * 权限类型 + */ + @Schema(description = "权限类型") + private Integer scopeCategory; + /** * 权限id */ diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/ApiScopeVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/ApiScopeVO.java new file mode 100644 index 00000000..0826e5e1 --- /dev/null +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/ApiScopeVO.java @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springblade.system.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.system.entity.ApiScope; + +import java.io.Serial; + +/** + * 视图实体类 + * + * @author Chill + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "ApiScopeVO对象") +public class ApiScopeVO extends ApiScope { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 规则类型名 + */ + private String scopeTypeName; +} diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/CheckedTreeVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/CheckedTreeVO.java index 23a074ed..023ec611 100644 --- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/CheckedTreeVO.java +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/CheckedTreeVO.java @@ -31,4 +31,6 @@ public class CheckedTreeVO { private List dataScope; + private List apiScope; + } diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantTreeVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantTreeVO.java index 6a19c5fa..de9b349e 100644 --- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantTreeVO.java +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantTreeVO.java @@ -35,4 +35,6 @@ public class GrantTreeVO implements Serializable { private List dataScope; + private List apiScope; + } diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantVO.java index f8dfe3a6..06db99c8 100644 --- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantVO.java +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantVO.java @@ -44,4 +44,7 @@ public class GrantVO implements Serializable { @Schema(description = "dataScopeIds集合") private List dataScopeIds; + @Schema(description = "apiScopeIds集合") + private List apiScopeIds; + } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/ApiScopeController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/ApiScopeController.java new file mode 100644 index 00000000..51273e56 --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/ApiScopeController.java @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springblade.system.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.cache.utils.CacheUtil; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; +import org.springblade.system.entity.ApiScope; +import org.springblade.system.service.IApiScopeService; +import org.springblade.system.vo.ApiScopeVO; +import org.springblade.system.wrapper.ApiScopeWrapper; +import org.springframework.web.bind.annotation.*; + +import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; + +/** + * 接口权限控制器 + * + * @author BladeX + */ +@RestController +@AllArgsConstructor +@RequestMapping("/api-scope") +@Tag(name = "接口权限", description = "接口权限") +public class ApiScopeController extends BladeController { + + private final IApiScopeService apiScopeService; + + /** + * 详情 + */ + @GetMapping("/detail") + @ApiOperationSupport(order = 1) + @Operation(summary = "详情", description = "传入dataScope") + public R detail(ApiScope dataScope) { + ApiScope detail = apiScopeService.getOne(Condition.getQueryWrapper(dataScope)); + return R.data(detail); + } + + /** + * 分页 + */ + @GetMapping("/list") + @ApiOperationSupport(order = 2) + @Operation(summary = "分页", description = "传入dataScope") + public R> list(ApiScope dataScope, Query query) { + IPage pages = apiScopeService.page(Condition.getPage(query), Condition.getQueryWrapper(dataScope)); + return R.data(ApiScopeWrapper.build().pageVO(pages)); + } + + /** + * 新增 + */ + @PostMapping("/save") + @ApiOperationSupport(order = 3) + @Operation(summary = "新增", description = "传入dataScope") + public R save(@Valid @RequestBody ApiScope dataScope) { + CacheUtil.clear(SYS_CACHE); + return R.status(apiScopeService.save(dataScope)); + } + + /** + * 修改 + */ + @PostMapping("/update") + @ApiOperationSupport(order = 4) + @Operation(summary = "修改", description = "传入dataScope") + public R update(@Valid @RequestBody ApiScope dataScope) { + CacheUtil.clear(SYS_CACHE); + return R.status(apiScopeService.updateById(dataScope)); + } + + /** + * 新增或修改 + */ + @PostMapping("/submit") + @ApiOperationSupport(order = 5) + @Operation(summary = "新增或修改", description = "传入dataScope") + public R submit(@Valid @RequestBody ApiScope dataScope) { + CacheUtil.clear(SYS_CACHE); + return R.status(apiScopeService.saveOrUpdate(dataScope)); + } + + + /** + * 删除 + */ + @PostMapping("/remove") + @ApiOperationSupport(order = 6) + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + CacheUtil.clear(SYS_CACHE); + return R.status(apiScopeService.deleteLogic(Func.toLongList(ids))); + } + +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/DataScopeController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/DataScopeController.java index 5bfd1ecf..145d3bf5 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/DataScopeController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/DataScopeController.java @@ -17,15 +17,16 @@ package org.springblade.system.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.CacheUtil; import org.springblade.core.tool.utils.Func; import org.springblade.system.entity.DataScope; import org.springblade.system.service.IDataScopeService; @@ -33,9 +34,8 @@ import org.springblade.system.vo.DataScopeVO; import org.springblade.system.wrapper.DataScopeWrapper; import org.springframework.web.bind.annotation.*; -import jakarta.validation.Valid; +import static org.springblade.core.cache.utils.CacheUtil.SYS_CACHE; -import static org.springblade.core.tool.utils.CacheUtil.SYS_CACHE; /** * 数据权限控制器 diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java index 93c6a072..b14a5a24 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java @@ -187,6 +187,7 @@ public class MenuController extends BladeController { GrantTreeVO vo = new GrantTreeVO(); vo.setMenu(menuService.grantTree(user)); vo.setDataScope(menuService.grantDataScopeTree(user)); + vo.setApiScope(menuService.grantApiScopeTree(user)); return R.data(vo); } @@ -200,6 +201,7 @@ public class MenuController extends BladeController { CheckedTreeVO vo = new CheckedTreeVO(); vo.setMenu(menuService.roleTreeKeys(roleIds)); vo.setDataScope(menuService.dataScopeTreeKeys(roleIds)); + vo.setApiScope(menuService.apiScopeTreeKeys(roleIds)); return R.data(vo); } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java index 43d8c103..530e53e7 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java @@ -26,11 +26,11 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.secure.BladeUser; import org.springblade.core.tool.api.R; import org.springblade.core.tool.constant.BladeConstant; -import org.springblade.core.tool.utils.CacheUtil; import org.springblade.core.tool.utils.Func; import org.springblade.system.entity.Role; import org.springblade.system.service.IRoleService; @@ -42,7 +42,8 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; -import static org.springblade.core.tool.utils.CacheUtil.SYS_CACHE; +import static org.springblade.core.cache.utils.CacheUtil.SYS_CACHE; + /** * 控制器 @@ -134,14 +135,14 @@ public class RoleController extends BladeController { } /** - * 设置菜单权限 + * 设置角色权限 */ @PostMapping("/grant") @ApiOperationSupport(order = 7) @Operation(summary = "权限设置", description = "传入roleId集合以及menuId集合") public R grant(@RequestBody GrantVO grantVO) { CacheUtil.clear(SYS_CACHE); - boolean temp = roleService.grant(grantVO.getRoleIds(), grantVO.getMenuIds(), grantVO.getDataScopeIds()); + boolean temp = roleService.grant(grantVO.getRoleIds(), grantVO.getMenuIds(), grantVO.getDataScopeIds(), grantVO.getApiScopeIds()); return R.status(temp); } } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java index 754b4585..0bf33f93 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java @@ -31,8 +31,10 @@ import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.tool.api.R; import org.springblade.core.tool.constant.BladeConstant; +import org.springblade.core.tool.constant.RoleConstant; import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.utils.Func; import org.springblade.system.entity.Tenant; @@ -76,6 +78,7 @@ public class TenantController extends BladeController { @Parameter(name = "contactNumber", description = "联系电话", in = ParameterIn.QUERY, schema = @Schema(type = "string")) }) @Operation(summary = "分页", description = "传入tenant") + @PreAuth(RoleConstant.HAS_ROLE_ADMIN) public R> list(@Parameter(hidden = true) @RequestParam Map tenant, Query query, BladeUser bladeUser) { QueryWrapper queryWrapper = Condition.getQueryWrapper(tenant, Tenant.class); IPage pages = tenantService.page(Condition.getPage(query), (!bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID)) ? queryWrapper.lambda().eq(Tenant::getTenantId, bladeUser.getTenantId()) : queryWrapper); diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java index e4f21203..beba5401 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java @@ -302,4 +302,14 @@ public class UserController { return R.success("操作成功"); } + /** + * 修改基本信息 + */ + @PostMapping("/update-info") + @ApiOperationSupport(order = 17) + @Operation(summary = "修改基本信息", description = "传入User") + public R updateInfo(@RequestBody User user) { + return R.status(userService.updateUserInfo(user)); + } + } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/feign/ApiScopeClient.java b/blade-service/blade-system/src/main/java/org/springblade/system/feign/ApiScopeClient.java new file mode 100644 index 00000000..fe4d11d5 --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/feign/ApiScopeClient.java @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springblade.system.feign; + +import io.swagger.v3.oas.annotations.Hidden; +import lombok.RequiredArgsConstructor; +import org.springblade.core.tool.utils.Func; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static org.springblade.core.secure.constant.PermissionConstant.permissionAllStatement; +import static org.springblade.core.secure.constant.PermissionConstant.permissionCodeStatement; + +/** + * 接口权限Feign实现类 + * + * @author Chill + */ +@Hidden +@RestController +@RequiredArgsConstructor +public class ApiScopeClient implements IApiScopeClient { + + private final JdbcTemplate jdbcTemplate; + + @Override + @GetMapping(PERMISSION_PATH) + public List permissionPath(String roleId) { + List roleIds = Func.toLongList(roleId); + return jdbcTemplate.queryForList(permissionAllStatement(roleIds.size()), String.class, roleIds.toArray()); + } + + @Override + @GetMapping(PERMISSION_CODE) + public List permissionCode(String permission, String roleId) { + List args = new ArrayList<>(Collections.singletonList(permission)); + List roleIds = Func.toLongList(roleId); + args.addAll(roleIds); + return jdbcTemplate.queryForList(permissionCodeStatement(roleIds.size()), String.class, args.toArray()); + } + +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ApiScopeMapper.java b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ApiScopeMapper.java new file mode 100644 index 00000000..54c27a7f --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ApiScopeMapper.java @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springblade.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springblade.system.entity.ApiScope; + +/** + * Mapper 接口 + * + * @author BladeX + */ +public interface ApiScopeMapper extends BaseMapper { + +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.java b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.java index 6c90c100..7bd5a1a5 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.java @@ -86,6 +86,21 @@ public interface MenuMapper extends BaseMapper

{ */ List grantDataScopeTreeByRole(List roleId); + /** + * 接口权限授权树形结构 + * + * @return + */ + List grantApiScopeTree(); + + /** + * 接口权限授权树形结构 + * + * @param roleId + * @return + */ + List grantApiScopeTreeByRole(List roleId); + /** * 顶部菜单树形结构 * diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.xml b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.xml index f1623e10..c43320fb 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.xml +++ b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.xml @@ -271,6 +271,106 @@ AND menu_id IS NOT NULL + + + +