我正在使用Spring Boot版本2.0.2Release。下面是我的安全配置
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity( prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) @ComponentScan("com.mk") public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private AuthenticationProvider myAuthenticationProvider; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); http.cors().configurationSource(corsConfigurationSource()) .and() .csrf().disable() .anonymous().and() .authorizeRequests() .antMatchers(HttpMethod.GET,"/index.html").permitAll() .antMatchers(HttpMethod.POST,"/login").permitAll() .antMatchers(HttpMethod.GET,"*").authenticated() .and().httpBasic(); } @Bean CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(Arrays.asList("*")); configuration.setAllowedMethods(Arrays.asList("GET","POST")); configuration.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; }
由于CORS的问题,我无法调用任何API(包括login是allowAll)。
在浏览器上,我得到了(它与Postman一起使用,因为未在其中进行CORS检查)
无法加载http:// localhost:8080 / myurl:对预检请求的响应未通过访问控制检查:所请求的资源上没有’Access- Control-Allow-Origin’标头。因此,不允许访问源’ http:// localhost:4200 ‘。响应的HTTP状态码为403。
尽管Spring安全性提供了一种在http configurer中配置CORS的方法,但是有一种更加干净的方法可以将CORS过滤器添加到应用程序中,
@Component @Order(Ordered.HIGHEST_PRECEDENCE) public class MyCORSFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me"); chain.doFilter(req, res); } @Override public void init(FilterConfig filterConfig) { } @Override public void destroy() { } }
对过滤器进行最高优先级排序可确保MyCORSFilter实现javax.servlet.Filter是链中的第一个实现。希望这可以帮助
javax.servlet.Filter