From 2fb09332c68af9339a822ad115336f059774bcf8 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Mon, 16 Dec 2024 13:48:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E5=8F=AF=E8=A7=86?= =?UTF-8?q?=E5=8C=96=E7=9B=91=E6=B5=8B):=E6=9D=83=E9=99=90=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E5=8F=AF=E8=A7=86=E5=8C=96=E4=BB=85gitlink?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=8F=AF=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GitlinkAdminAccessInterceptor.java | 46 +++++++++++++++++++ .../GitlinkAdminAccessRequired.java | 10 ++++ .../microservices/dss/config/WebConfig.java | 21 +++++++++ .../controller/MakerSpaceDataController.java | 19 ++++---- .../controller/ProjectDataController.java | 11 +++-- .../dss/projects/mapper/UserMapper.java | 4 ++ .../main/resources/mapper/dss/UserMapper.xml | 10 ++++ 7 files changed, 108 insertions(+), 13 deletions(-) create mode 100644 microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/Interceptor/GitlinkAdminAccessInterceptor.java create mode 100644 microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/annotation/GitlinkAdminAccessRequired.java create mode 100644 microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/config/WebConfig.java diff --git a/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/Interceptor/GitlinkAdminAccessInterceptor.java b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/Interceptor/GitlinkAdminAccessInterceptor.java new file mode 100644 index 000000000..6bfeb21ff --- /dev/null +++ b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/Interceptor/GitlinkAdminAccessInterceptor.java @@ -0,0 +1,46 @@ +package com.microservices.dss.Interceptor; + +import com.microservices.common.core.utils.SpringUtils; +import com.microservices.dss.annotation.GitlinkAdminAccessRequired; +import com.microservices.dss.projects.mapper.UserMapper; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; + +import static com.microservices.common.security.auth.AuthUtil.getGitLinkRequestToken; + +@Component +public class GitlinkAdminAccessInterceptor implements HandlerInterceptor { + + public UserMapper userMapper = SpringUtils.getBean(UserMapper.class); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (handler instanceof HandlerMethod) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + if (method.isAnnotationPresent(GitlinkAdminAccessRequired.class)) { + String token = getGitLinkRequestToken(request); + Long userId = userMapper.getUserIdByToken(token); // 根据token获取用户ID + if (userId == null) { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); // 403 Forbidden + return false; + } + Boolean isAdmin = userMapper.getAdminStatus(userId); // 根据用户ID获取admin字段值 + if (isAdmin == null || !isAdmin) { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); // 403 Forbidden + return false; + } + } + } + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + // 可以在这里添加一些完成后的处理逻辑 + } +} diff --git a/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/annotation/GitlinkAdminAccessRequired.java b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/annotation/GitlinkAdminAccessRequired.java new file mode 100644 index 000000000..c40631aeb --- /dev/null +++ b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/annotation/GitlinkAdminAccessRequired.java @@ -0,0 +1,10 @@ +package com.microservices.dss.annotation; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface GitlinkAdminAccessRequired { +} diff --git a/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/config/WebConfig.java b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/config/WebConfig.java new file mode 100644 index 000000000..9ea44d69b --- /dev/null +++ b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/config/WebConfig.java @@ -0,0 +1,21 @@ +package com.microservices.dss.config; + +import com.microservices.dss.Interceptor.GitlinkAdminAccessInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(gitlinkAdminAccessInterceptor()) + .addPathPatterns("/**"); + } + + public GitlinkAdminAccessInterceptor gitlinkAdminAccessInterceptor() { + return new GitlinkAdminAccessInterceptor(); + } +} diff --git a/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/makerspace/controller/MakerSpaceDataController.java b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/makerspace/controller/MakerSpaceDataController.java index 3b0e23765..87f17e0e4 100644 --- a/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/makerspace/controller/MakerSpaceDataController.java +++ b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/makerspace/controller/MakerSpaceDataController.java @@ -2,6 +2,7 @@ package com.microservices.dss.makerspace.controller; import com.microservices.common.core.web.controller.BaseController; import com.microservices.common.core.web.domain.AjaxResult; +import com.microservices.dss.annotation.GitlinkAdminAccessRequired; import com.microservices.dss.makerspace.service.ITasksService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -13,7 +14,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/makerSpace") +@RequestMapping("/open/makerSpace") @Api(tags = "数据统计-创客空间相关接口") public class MakerSpaceDataController extends BaseController { @@ -22,61 +23,63 @@ public class MakerSpaceDataController extends BaseController { @ApiOperation("创客空间全局资源获取") @GetMapping(value = "/total") -// @RequiresPermissions(value = {"dss:dssMakerSpace:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getTotalData() { return success(tasksService.getTotalStatisticalData()); } @ApiOperation("创客任务新增趋势") @GetMapping(value = "/task/trend") -// @RequiresPermissions(value = {"dss:dssMakerSpace:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getTaskTrendData() { return success(tasksService.getTaskAdditionTrendData()); } @ApiOperation("创客成果新增趋势") @GetMapping(value = "/paper/trend") -// @RequiresPermissions(value = {"dss:dssMakerSpace:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getPaperTrendData() { return success(tasksService.getPaperAdditionTrendData()); } @ApiOperation("创客任务最新操作日志") @GetMapping(value = "/task/operLog") -// @RequiresPermissions(value = {"dss:dssMakerSpace:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getPaperTrendData(@ApiParam("获取最新操作日志的数量") @RequestParam Integer topNum) { return success(tasksService.getTaskOperLogTopN(topNum)); } @ApiOperation("创客任务奖金分布") @GetMapping(value = "/task/bountyDistribution") -// @RequiresPermissions(value = {"dss:dssMakerSpace:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getBountyDistribution() { return success(tasksService.getBountyDistribution()); } @ApiOperation("创客任务热度排行") @GetMapping(value = "/task/heatRank") -// @RequiresPermissions(value = {"dss:dssMakerSpace:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getHeatTopN(@ApiParam("获取热度排行的数量") @RequestParam Integer topNum) { return success(tasksService.getTaskHeatTopN(topNum)); } @ApiOperation("创客类型分布统计(统筹/自主)") @GetMapping(value = "/task/mode") -// @RequiresPermissions(value = {"dss:dssMakerSpace:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getTaskModeStatisticalData() { return success(tasksService.getTaskModeStatisticalData()); } @ApiOperation("创客任务-开启中状态任务数分布") @GetMapping(value = "/task/statusDistribution/opening") + @GitlinkAdminAccessRequired public AjaxResult getOpeningTaskStatusDistribution(@ApiParam("获取开启中状态任务分布的数量") @RequestParam Integer topNum) { return success(tasksService.getOpeningTaskStatusDistribution(topNum)); } @ApiOperation("创客任务-所有任务类型分布") @GetMapping(value = "/task/categoryDistribution") + @GitlinkAdminAccessRequired public AjaxResult getAllTaskCategoryDistribution() { return success(tasksService.getAllTaskCategoryDistribution()); } diff --git a/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/projects/controller/ProjectDataController.java b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/projects/controller/ProjectDataController.java index bc5bbfad9..e04810d40 100644 --- a/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/projects/controller/ProjectDataController.java +++ b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/projects/controller/ProjectDataController.java @@ -3,6 +3,7 @@ package com.microservices.dss.projects.controller; import com.fasterxml.jackson.core.JsonProcessingException; import com.microservices.common.core.web.controller.BaseController; import com.microservices.common.core.web.domain.AjaxResult; +import com.microservices.dss.annotation.GitlinkAdminAccessRequired; import com.microservices.dss.projects.service.IProjectGlobalResourcesService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -16,7 +17,7 @@ import org.springframework.web.bind.annotation.RestController; import java.text.ParseException; @RestController -@RequestMapping("/projects") +@RequestMapping("/open/projects") @Api(tags = "数据统计-开源项目相关接口") public class ProjectDataController extends BaseController { @@ -25,14 +26,14 @@ public class ProjectDataController extends BaseController { @ApiOperation("开源项目全局资源获取") @GetMapping(value = "/global-resources") -// @RequiresPermissions(value = {"dss:dssProjects:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getGlobalResourcesData() throws ParseException, JsonProcessingException { return success(projectGlobalResourcesService.getProjectGlobalResourcesData()); } @ApiOperation("开源项目最新动态获取") @GetMapping(value = "/latestActivities") -// @RequiresPermissions(value = {"dss:dssProjects:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getLatestActivitiesData(@ApiParam("分页数") @RequestParam(value = "page", defaultValue = "1") int page, @ApiParam("分页大小") @RequestParam(value = "limit", defaultValue = "4") int limit){ return success(projectGlobalResourcesService.getLatestActivitiesData(page, limit)); @@ -40,7 +41,7 @@ public class ProjectDataController extends BaseController { @ApiOperation("开源项目-项目排行获取") @GetMapping(value = "/projectRank") -// @RequiresPermissions(value = {"dss:dssProjects:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getProjectRankData(@ApiParam("统计时间范围(天)") @RequestParam(value = "time", defaultValue = "365") int time, @ApiParam("top数") @RequestParam(value = "limit", defaultValue = "5") int limit){ return success(projectGlobalResourcesService.getProjectRankData(time, limit)); @@ -48,7 +49,7 @@ public class ProjectDataController extends BaseController { @ApiOperation("开源项目-用户排行获取") @GetMapping(value = "/userRank") -// @RequiresPermissions(value = {"dss:dssProjects:show"}, logical = Logical.OR) + @GitlinkAdminAccessRequired public AjaxResult getUserRankData(@ApiParam("统计时间范围(天)") @RequestParam(value = "time", defaultValue = "365") int time, @ApiParam("top数") @RequestParam(value = "limit", defaultValue = "5") int limit){ return success(projectGlobalResourcesService.getUserRankData(time, limit)); diff --git a/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/projects/mapper/UserMapper.java b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/projects/mapper/UserMapper.java index 356a14a57..6362fd3c6 100644 --- a/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/projects/mapper/UserMapper.java +++ b/microservices-modules/microservices-modules-dss/src/main/java/com/microservices/dss/projects/mapper/UserMapper.java @@ -13,4 +13,8 @@ public interface UserMapper { List getNewAddedMembersByMonth(@Param("startTime") String startTime, @Param("endTime") String endTime); List getActiveMembersByMonth(@Param("startTime") String startTime, @Param("endTime") String endTime); + + Long getUserIdByToken(@Param("token") String token); + + Boolean getAdminStatus(@Param("userId") Long userId); } diff --git a/microservices-modules/microservices-modules-dss/src/main/resources/mapper/dss/UserMapper.xml b/microservices-modules/microservices-modules-dss/src/main/resources/mapper/dss/UserMapper.xml index 7f4b033d7..64456a076 100644 --- a/microservices-modules/microservices-modules-dss/src/main/resources/mapper/dss/UserMapper.xml +++ b/microservices-modules/microservices-modules-dss/src/main/resources/mapper/dss/UserMapper.xml @@ -82,4 +82,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT DISTINCT user_id, DATE_FORMAT(updated_at, '%Y-%m-%d' ) as updated_on FROM commit_logs WHERE updated_at >= #{startTime,jdbcType=VARCHAR} AND updated_at <= #{endTime,jdbcType=VARCHAR} ) as t GROUP BY createTime + + \ No newline at end of file