From c9da42e65eff27516b9971008160faa48b301b21 Mon Sep 17 00:00:00 2001 From: xuhy <3313886187@qq.com> Date: 星期四, 02 一月 2025 16:52:56 +0800 Subject: [PATCH] 修改 --- /dev/null | 28 -------------- manage/src/main/java/com/jilongda/manage/config/WebSecurityConfig.java | 14 ++++-- common/src/main/java/com/jilongda/common/security/ExceptionHandleFilter.java | 41 ++++++++++++++++++++ manage/src/main/java/com/jilongda/manage/ManageApplication.java | 2 + manage/src/main/resources/application.yml | 8 ++-- 5 files changed, 56 insertions(+), 37 deletions(-) diff --git a/common/src/main/java/com/jilongda/common/config/CorsConfig.java b/common/src/main/java/com/jilongda/common/config/CorsConfig.java deleted file mode 100644 index 4e2bcd9..0000000 --- a/common/src/main/java/com/jilongda/common/config/CorsConfig.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.jilongda.common.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.cors.reactive.CorsUtils; -import org.springframework.web.filter.CorsFilter; -import org.springframework.web.server.ServerWebExchange; -import org.springframework.web.server.WebFilter; -import org.springframework.web.server.WebFilterChain; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.function.RequestPredicates; -import org.springframework.web.servlet.function.RouterFunction; -import org.springframework.web.servlet.function.RouterFunctions; -import reactor.core.publisher.Mono; - -import java.util.Collections; - -/** - * 实现基本的跨域请求 - * 2.4.0 通多配置 - * - * @author xiaochen - * @Override public void addCorsMappings(CorsRegistry registry) { - * registry.addMapping("/**") - * // SpringBoot2.4.0 [allowedOriginPatterns]代替[allowedOrigins] - * .allowedOriginPatterns("*") - * .allowedMethods("*") - * .maxAge(3600) - * .allowCredentials(true); - * } - */ -@Configuration -public class CorsConfig { - - /** - * 这里为支持的请求头,如果有自定义的header字段请自己添加 - */ - private static final String ALLOWED_HEADERS = "X-Requested-With, Content-Type, Authorization, credential, X-XSRF-TOKEN, token, username, client, request-origion"; - private static final String ALLOWED_METHODS = "GET,POST,PUT,DELETE"; - private static final String ALLOWED_ORIGIN = "*"; - private static final String ALLOWED_EXPOSE = "*"; - private static final String MAX_AGE = "18000L"; - - /** - * 跨域配置 - */ - @Bean - public WebFilter corsFilter() - { - return (ServerWebExchange ctx, WebFilterChain chain) -> { - ServerHttpRequest request = ctx.getRequest(); - if (CorsUtils.isCorsRequest(request)) - { - ServerHttpResponse response = ctx.getResponse(); - HttpHeaders headers = response.getHeaders(); - headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS); - headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS); - headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN); - headers.add("Access-Control-Expose-Headers", ALLOWED_EXPOSE); - headers.add("Access-Control-Max-Age", MAX_AGE); - headers.add("Access-Control-Allow-Credentials", "false"); - if (request.getMethod() == HttpMethod.OPTIONS) - { - response.setStatusCode(HttpStatus.OK); - return Mono.empty(); - } - } - return chain.filter(ctx); - }; - } - - @Bean - public CorsRegistry addCorsMappings() { - return new CorsRegistry(); - } - - @Bean - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOriginPatterns("*") - .allowedMethods("*") - .maxAge(3600) - .allowCredentials(true); - } - -} diff --git a/common/src/main/java/com/jilongda/common/security/ExceptionHandleFilter.java b/common/src/main/java/com/jilongda/common/security/ExceptionHandleFilter.java new file mode 100644 index 0000000..962bf53 --- /dev/null +++ b/common/src/main/java/com/jilongda/common/security/ExceptionHandleFilter.java @@ -0,0 +1,41 @@ +package com.jilongda.common.security; + +import com.jilongda.common.basic.ApiResult; +import com.jilongda.common.exception.ServiceException; +import com.jilongda.common.exception.TokenException; +import com.jilongda.common.utils.ResponseUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author liheng + * @ClassName ExceptionHandleFilter + * @Description 最外层filter处理验证token、登录认证和授权过滤器中抛出的所有异常 + * @date 2020-08-24 9:31 + */ +@Slf4j +public class ExceptionHandleFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) { + // 全局异常无法捕捉过滤器异常,需在此处做处理 + try { + filterChain.doFilter(httpServletRequest, httpServletResponse); + } catch (Exception e) { + // 如果是业务异常,需返回状态码 + if (e instanceof ServiceException) { + ServiceException e1 = (ServiceException) e; + ResponseUtils.renderJson(httpServletResponse, ApiResult.failed(e1.getCode(), e.getMessage())); + } else if (e instanceof TokenException) { + TokenException e1 = (TokenException) e; + ResponseUtils.renderJson(httpServletResponse, ApiResult.failed(e1.getCode(), e.getMessage())); + } else { + ResponseUtils.renderJson(httpServletResponse, ApiResult.failed(e.getMessage())); + } + return; + } + } +} diff --git a/common/src/main/java/com/jilongda/common/security/filter/CorsFilter.java b/common/src/main/java/com/jilongda/common/security/filter/CorsFilter.java deleted file mode 100644 index a88baab..0000000 --- a/common/src/main/java/com/jilongda/common/security/filter/CorsFilter.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.jilongda.common.security.filter; - -import com.aliyun.oss.HttpMethod; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.google.common.net.HttpHeaders; -import lombok.extern.slf4j.Slf4j; -import org.mybatis.logging.LoggerFactory; - -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.logging.Logger; - -@Slf4j -@WebFilter(urlPatterns = {"/*"}, filterName = "corsFilter") -public class CorsFilter implements Filter { -// private static final Logger logger = LoggerFactory.getLogger(IsvSearchController.class); - - private String allowOrigin = "*"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { -// logger.info("doFilter start ..."); - HttpServletRequest request = (HttpServletRequest) servletRequest; - HttpServletResponse response = (HttpServletResponse) servletResponse; - if (StringUtils.isNotEmpty(allowOrigin)) { - List<String> allowOriginList = Arrays.asList(allowOrigin.split(",")); - if (!CollectionUtils.isEmpty(allowOriginList)) { - String currentOrigin = request.getHeader("Origin"); - if (allowOriginList.contains(currentOrigin)) { - response.setHeader("Access-Control-Allow-Origin", currentOrigin); - } - } - } - response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS"); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Allow-Origin", "*"); - response.setHeader("Access-Control-Allow-Headers", "content-Type"); - if (HttpMethod.OPTIONS.name().equalsIgnoreCase(request.getMethod()) &&/*options 请求返回允许跨域的头*/ - request.getHeader(HttpHeaders.ORIGIN) != null) { -// logger.info("doFilter options request"); - return; - } - filterChain.doFilter(servletRequest, servletResponse); - } - - @Override - public void destroy() { - - } -} \ No newline at end of file diff --git a/common/src/main/java/com/jilongda/common/security/filter/XssAndSqlHttpServletRequestWrapper.java b/common/src/main/java/com/jilongda/common/security/filter/XssAndSqlHttpServletRequestWrapper.java deleted file mode 100644 index 8320186..0000000 --- a/common/src/main/java/com/jilongda/common/security/filter/XssAndSqlHttpServletRequestWrapper.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jilongda.common.security.filter; - -import org.apache.commons.lang3.StringEscapeUtils; -import org.apache.commons.lang3.StringUtils; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; - -/** - * @author yu 2019/1/20. - */ -public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrapper { - - private HttpServletRequest request; - - public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) { - super(request); - this.request = request; - } - - @Override - public String getParameter(String name) { - String value = request.getParameter(name); - if (!StringUtils.isEmpty(value)) { - value = StringEscapeUtils.escapeHtml4(value); - } - return value; - } - - @Override - public String[] getParameterValues(String name) { - String[] parameterValues = super.getParameterValues(name); - if (parameterValues == null) { - return null; - } - for (int i = 0; i < parameterValues.length; i++) { - String value = parameterValues[i]; - parameterValues[i] = StringEscapeUtils.escapeHtml4(value); - } - return parameterValues; - } -} diff --git a/common/src/main/java/com/jilongda/common/security/filter/XssFilter.java b/common/src/main/java/com/jilongda/common/security/filter/XssFilter.java deleted file mode 100644 index c10985f..0000000 --- a/common/src/main/java/com/jilongda/common/security/filter/XssFilter.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.jilongda.common.security.filter; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -/** - * @author yu 2019/1/20. - */ -public class XssFilter implements Filter { - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - HttpServletRequest req = (HttpServletRequest) request; - XssAndSqlHttpServletRequestWrapper xssRequestWrapper = new XssAndSqlHttpServletRequestWrapper(req); - - - chain.doFilter(xssRequestWrapper, response); - } - - @Override - public void destroy() { - - } - - /** - * 过滤json类型的 - * - * @param builder - * @return - */ - @Bean - @Primary - public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) { - //解析器 - ObjectMapper objectMapper = builder.createXmlMapper(false).build(); - //注册xss解析器 - SimpleModule xssModule = new SimpleModule("XssStringJsonSerializer"); - xssModule.addSerializer(new XssStringJsonSerializer()); - objectMapper.registerModule(xssModule); - //返回 - return objectMapper; - } - - -} diff --git a/common/src/main/java/com/jilongda/common/security/filter/XssStringJsonSerializer.java b/common/src/main/java/com/jilongda/common/security/filter/XssStringJsonSerializer.java deleted file mode 100644 index ffcf640..0000000 --- a/common/src/main/java/com/jilongda/common/security/filter/XssStringJsonSerializer.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.jilongda.common.security.filter; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import org.apache.commons.lang3.StringEscapeUtils; - -import java.io.IOException; - -/** - * @author yu 2019/1/20. - */ -public class XssStringJsonSerializer extends JsonSerializer<String> { - - @Override - public Class<String> handledType() { - return String.class; - } - - @Override - public void serialize(String value, JsonGenerator jsonGenerator, - SerializerProvider serializerProvider) throws IOException { - if (value != null) { - String encodedValue = StringEscapeUtils.escapeHtml4(value); - jsonGenerator.writeString(encodedValue); - } - } -} diff --git a/manage/src/main/java/com/jilongda/manage/ManageApplication.java b/manage/src/main/java/com/jilongda/manage/ManageApplication.java index d1a05ec..caf37c5 100644 --- a/manage/src/main/java/com/jilongda/manage/ManageApplication.java +++ b/manage/src/main/java/com/jilongda/manage/ManageApplication.java @@ -11,6 +11,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import java.net.InetAddress; @@ -26,6 +27,7 @@ @MapperScan({"com.jilongda.manage.mapper", "com.jilongda.manage.authority.mapper"}) @EnableTransactionManagement @SpringBootApplication +@CrossOrigin public class ManageApplication { public static void main(String[] args) throws UnknownHostException { diff --git a/manage/src/main/java/com/jilongda/manage/config/WebSecurityConfig.java b/manage/src/main/java/com/jilongda/manage/config/WebSecurityConfig.java index 58186dd..328ce4f 100644 --- a/manage/src/main/java/com/jilongda/manage/config/WebSecurityConfig.java +++ b/manage/src/main/java/com/jilongda/manage/config/WebSecurityConfig.java @@ -1,5 +1,6 @@ package com.jilongda.manage.config; +import com.jilongda.common.security.ExceptionHandleFilter; import com.jilongda.manage.security.SecurityAccessDeniedHandler; import com.jilongda.manage.security.SysUserDetailsService; import com.jilongda.common.basic.Constant; @@ -22,6 +23,7 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.csrf.CookieCsrfTokenRepository; /** * 细粒度的访问控制 @@ -59,8 +61,8 @@ */ @Bean public SecurityUtils securityUtils() { -// return new SecurityUtils(accessTokenCache,refreshTokenCache); - return new SecurityUtils(); + return new SecurityUtils(accessTokenCache,refreshTokenCache); +// return new SecurityUtils(); } @@ -107,14 +109,14 @@ .logout().disable() .csrf().disable() // 放在 Cookie 中返回前端,防止跨域伪造 - //.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and() +// .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and() //.and() .authorizeRequests() // 跨域预检请求 -// .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() + .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() // 登录URL permitAll() 无需保护 ---> 此种方式配置忽略认证规则会走Spring Security 过滤器链,在过滤器链中,给请求放行 // 不需要保护的请求,但需要经过过滤连 - .antMatchers(HttpMethod.POST, "/**").permitAll() +// .antMatchers(HttpMethod.POST, "/**").permitAll() // 其他都需要权限认证 .anyRequest() .authenticated() @@ -135,6 +137,8 @@ http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 访问控制时登录状态检查过滤器 http.addFilterBefore(new AuthenticationFilter(securityUtils()), UsernamePasswordAuthenticationFilter.class); + // 异常捕捉过滤器,必须在AuthenticationFilter之前才能捕捉到异常信息 + http.addFilterBefore(new ExceptionHandleFilter(), AuthenticationFilter.class); //禁用缓存 http.headers().cacheControl(); } diff --git a/manage/src/main/resources/application.yml b/manage/src/main/resources/application.yml index 0d0dbcc..fe82c8c 100644 --- a/manage/src/main/resources/application.yml +++ b/manage/src/main/resources/application.yml @@ -13,8 +13,8 @@ max-request-size: 500MB resolve-lazily: true #设置为懒加载,不然依然会捕获不到异常 profiles: -# active: dev - active: prod + active: dev +# active: prod main: allow-bean-definition-overriding: true #sagger文档属性配置 @@ -89,8 +89,8 @@ # 数据源 datasource: username: root #测试环境 - password: YanDu@2025! - url: jdbc:mysql://127.0.0.1:3306/eyes?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + password: 123456 + url: jdbc:mysql://192.168.110.34:3306/eyes?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver hikari: -- Gitblit v1.7.1