diff --git a/pigx-visual/pigx-report-platform/pom.xml b/pigx-visual/pigx-report-platform/pom.xml index 1f14824a3..9b5d09121 100644 --- a/pigx-visual/pigx-report-platform/pom.xml +++ b/pigx-visual/pigx-report-platform/pom.xml @@ -14,7 +14,9 @@ jar 基于 aj-report 的大屏设计系统 - + + 0.0.3 + @@ -33,10 +35,9 @@ io.springboot.plugin goview-spring-boot-starter - 0.0.2 + ${goview.version} - com.mysql mysql-connector-j diff --git a/pigx-visual/pigx-report-platform/src/main/java/com/pig4cloud/pigx/report/config/SecurityRequestFilter.java b/pigx-visual/pigx-report-platform/src/main/java/com/pig4cloud/pigx/report/config/SecurityRequestFilter.java index 3f8764c64..acdfa5c8a 100644 --- a/pigx-visual/pigx-report-platform/src/main/java/com/pig4cloud/pigx/report/config/SecurityRequestFilter.java +++ b/pigx-visual/pigx-report-platform/src/main/java/com/pig4cloud/pigx/report/config/SecurityRequestFilter.java @@ -1,26 +1,33 @@ package com.pig4cloud.pigx.report.config; +import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.ContentType; -import com.fasterxml.jackson.databind.ObjectMapper; +import cn.hutool.json.JSONUtil; import com.pig4cloud.pigx.admin.api.feign.RemoteTokenService; import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.util.RetOps; import io.springboot.plugin.goview.common.domain.AjaxResult; +import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; import org.springframework.web.filter.OncePerRequestFilter; -import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; /** @@ -33,46 +40,81 @@ import java.util.Optional; @Configuration(proxyBeanMethods = false) public class SecurityRequestFilter extends OncePerRequestFilter { + private final PathMatcher pathMatcher = new AntPathMatcher(); + private final RemoteTokenService remoteTokenService; - private final ObjectMapper objectMapper; + private final SecurityConfiguration securityConfiguration; - @Override + /** + * 在请求被处理前执行过滤操作 + * @param request HttpServletRequest对象 + * @param response HttpServletResponse对象 + * @param filterChain 过滤器链条 + */ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - + // 获取请求URI String requestURI = request.getRequestURI(); + List ignoreUrls = securityConfiguration.getIgnoreUrls(); - if (StrUtil.equalsAny(requestURI, "/", "/project/getData") || StrUtil.contains(requestURI, "/static")) { + // 如果请求URI匹配特定的值,允许该请求通过 + if (ignoreUrls.stream().anyMatch(ignoreUrl -> pathMatcher.match(ignoreUrl, requestURI))) { filterChain.doFilter(request, response); return; } + // 获取请求头中的token和tenantId参数 String accessToken = request.getHeader("token"); String tenantId = request.getHeader(CommonConstants.TENANT_ID); - if (StrUtil.isBlank(accessToken) || StrUtil.isBlank(tenantId)) { + // 如果token参数不存在,返回错误信息 + if (StrUtil.isBlank(accessToken)) { sendErrorMsg(request, response); return; } + // 当tenantId参数不存在时,默认为1 + tenantId = StrUtil.isBlank(tenantId) ? tenantId : "1"; + + // 获取用户信息 Optional principalName = RetOps .of(remoteTokenService.queryToken(accessToken, tenantId, SecurityConstants.FROM_IN)) .getDataIf(RetOps.CODE_SUCCESS).map(o -> (String) o.get("principalName")); - // 用户信息查不到 + // 如果用户信息不存在,返回错误信息 if (!principalName.isPresent()) { sendErrorMsg(request, response); return; } + // 允许该请求通过 filterChain.doFilter(request, response); } + /** + * 向客户端发送错误消息 + * @param request HttpServletRequest对象 + * @param response HttpServletResponse对象 + */ private void sendErrorMsg(HttpServletRequest request, HttpServletResponse response) throws IOException { - AjaxResult error = AjaxResult.error(HttpStatus.UNAUTHORIZED.value(), "require login"); + response.setCharacterEncoding(CharsetUtil.UTF_8); response.setContentType(ContentType.JSON.getValue()); - response.getWriter().write(objectMapper.writeValueAsString(error)); + PrintWriter out = response.getWriter(); + out.println(JSONUtil.toJsonStr(AjaxResult.error(HttpStatus.UNAUTHORIZED.value(), "token require"))); + out.flush(); + out.close(); } } + +@Component +@Configuration +@ConfigurationProperties(prefix = "security.oauth2.client") +class SecurityConfiguration { + + @Getter + @Setter + private List ignoreUrls = new ArrayList<>(); + +}