@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class CorsSecurityConfig extends WebSecurityConfigurerAdapter {
//自定义过滤器
@Autowired
YourCorsFilter yourCorsFilter;
//自定义token过滤器
@Autowired
TokenFilter tokenFilter;
//自定义token认证provider
@Autowired
TokenAuthenticationProvider tokenAuthenticationProvider;
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**")
.antMatchers("/swagger-resources/**", "/swagger-ui/**", "/v2/api-docs/**")
.antMatchers("/swagger-ui.html/**")
.antMatchers("/swagger-ui.htm/**")
;
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class).addFilterBefore(
yourCorsFilter
, TokenFilter.class);
http.cors().and()
.csrf().disable()
// Disable CSRF for simplicity, be careful with this in production
.authorizeRequests()
.antMatchers("/my-service/**").authenticated()
.antMatchers("/swagger-ui.html/**").permitAll()
.antMatchers("/swagger-ui.htm/**").permitAll()
.antMatchers(HttpMethod.OPTIONS).permitAll()
.antMatchers(HttpMethod.POST).authenticated()
.antMatchers(HttpMethod.GET).authenticated()
.antMatchers(HttpMethod.PUT).authenticated()
.antMatchers(HttpMethod.DELETE).authenticated()
.antMatchers(HttpMethod.PATCH).authenticated()
;
;;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(
tokenAuthenticationProvider
);
}
}
public class
TokenAuthenticationProvider implements AuthenticationProvider, InitializingBean {
}
@Order(0)
@Component
public class YourCorsFilter extends GenericFilterBean {
public ApaasCorsFilter() {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS,PATCH");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
//options 方法直接返回ok 绕过认证 options通常不带authrization
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
return;
}
filterChain.doFilter(servletRequest, response);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术