春季启动CORS配置
Posted
技术标签:
【中文标题】春季启动CORS配置【英文标题】:Spring boot CORS configuration 【发布时间】:2019-01-09 03:29:36 【问题描述】:我有 Spring Boot Rest 应用程序。 最近我使用 JsonWebToken 实现了用户认证。
当我使用邮递员对其进行测试时,一切似乎都运行良好, 但是当从 Angular 应用程序调用其余部分时,我得到了错误 引用cors:
对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:4200' 不允许访问。响应的 HTTP 状态代码为 403。
这是我的代码:
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter
@Autowired
private JwtAuthFilter authFilter;
@Autowired
private JwtAuthenticationProvider authenticationProvider;
@Autowired
private JwtAuthenticationEntryPoint authenticationEntryPoint;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.authenticationProvider(authenticationProvider);
@Override
protected void configure(HttpSecurity http) throws Exception
//http.csrf().ignoringAntMatchers("/token");
http.csrf().disable();
http.cors().and().authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers("/token").permitAll()
.antMatchers("/rest/**").authenticated()
.and()
.addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class)
.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint);
@Bean
CorsConfigurationSource corsConfigurationSource()
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("GET","POST","OPTIONS","PUT","DELETE"));
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/rest/**", configuration);
return source;
JwtAuthFilter:
@Component
public class JwtAuthFilter implements Filter
@Override
public void doFilter(ServletRequest request, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String authorization = servletRequest.getHeader("Authorization");
String origin = servletRequest.getHeader("Origin");
if (authorization != null)
JwtAuthToken token = new JwtAuthToken(authorization.replaceAll("Bearer ", ""));
SecurityContextHolder.getContext().setAuthentication(token);
filterChain.doFilter(servletRequest, response);
@Override
public void destroy()
@Override
public void init(FilterConfig filterConfig) throws ServletException
我的登录Controller有一个映射“/token”,其他所有控制器都映射为“/rest/**” 有趣的是,调用“/token”控制器工作正常……它返回令牌和用户详细信息。服务器响应包含:
访问控制允许凭据 →true 访问控制允许来源→http://localhost:4200但是当我调用任何其他控制器时......例如“/rest/task/all”我收到错误并且没有 access-control-allow-credentials 和 access-control-allow-origin 标头。
当我改变时
source.registerCorsConfiguration("/rest/**", configuration);
到
source.registerCorsConfiguration("/**", configuration);
我收到错误消息,我在 access-control-allow-origin 标头中有两个值 http://localhost:4200 和 http://localhost:4200
任何人都可以提供任何帮助:D?
【问题讨论】:
【参考方案1】:这是一个老问题,我不确定您是否找到了答案。我只能建议调试这些问题的方法,因为这些问题通常非常容易设置。
1.First - 仅 Java 代码不足以调试 CORS 问题。您需要查看浏览器网络选项卡并查看哪个调用失败 - OPTIONS 调用或实际数据调用。其次,在浏览器中,需要仔细查看请求和响应标头是否有失败的请求,并且需要列出这些标头。下面这些。
在请求方面 - Origin
在响应方面 - Access-Control-Allow-Credentials
、 Access-Control-Allow-Headers
、 Access-Control-Allow-Methods
和 Access-Control-Allow-Origin
2.
当我使用邮递员对其进行测试时,一切似乎都运行良好,但是当 其余部分是从 Angular 应用程序调用的,我遇到了错误 核心:
这是正常行为,因为 CORS 是一种浏览器安全功能,您可能不会在任何其他客户端中看到此问题。 CORS 错误并不意味着您的 API 调用没有成功,它只意味着浏览器正在抑制响应而不是继续前进。
因此,如果您的 API 使用者不是网络浏览器,那么您很可能在 API 方面与 CORS 无关。其他客户端不会通过包含OPTIONS
请求使其成为两步过程。
3.Configuration 行 - http.cors()
将添加过滤器 - org.springframework.web.filter.CorsFilter
到您的过滤器链中,因此在您的 JwtAuthFilter
中放置断点以查看代码流向何处。
4. url 的系统行为预计会有所不同 - /token
和 /rest/**
因为令牌 url 不安全,而 rest/** 仅允许经过身份验证的用户使用,因此会出现额外的过滤器。
Spring Security exclude url patterns in security annotation configurartion
How to disable spring security for particular url
因此,查找 CORS 问题的理想方法是通过接收有问题的请求并验证响应标头 - Access-Control-Allow-Origin
已正确填充来调试您的代码。
【讨论】:
以上是关于春季启动CORS配置的主要内容,如果未能解决你的问题,请参考以下文章