转载

关于Spring Security OAuth2 中 CORS 跨域正解

  1. 跨域是如何产生的?

    跨域则是是同源策略导致的

    • 什么事同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

*同源策略,它是由Netscape提出的一个著名的安全策略。

*现在所有支持JavaScript 的浏览器都会使用这个策略。

*所谓 同源是指,域名,协议,端口相同

*当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面

*当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,

*即检查是否同源,只有和百度同源的脚本才会被执行。

*如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

  1. 跨域集中解决方案

    • 通过nginx代理

      nginx很简单即可处理,此问着重讲Spring Security的解决方案

      • 通过服务器处理
      1. 通过Controller添加注解@CrossOrigin,此方法比较繁琐,每个Controller都需要使用此注解,如一些隐性接口(jar包提供)则无法使用注解
      2. 通过security的配置接口
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.web.cors.CorsConfiguration;
      import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
      import org.springframework.web.filter.CorsFilter;
      @Configuration
      public class GlobalCorsConfig {
        @Bean
        public CorsFilter corsFilter() {
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            corsConfiguration.setAllowCredentials(true);
            corsConfiguration.addAllowedOrigin("*");
            corsConfiguration.addAllowedHeader("*");
            corsConfiguration.addAllowedMethod("*");
            UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
            urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
            return new CorsFilter(urlBasedCorsConfigurationSource);
        }
      }
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
    //注入登录业务处理
    @Autowired
    private LoginAuthenticationFilter loginAuthenticationFilter;
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                //跨域配置开始
                .cors().disable()
                .cors()
                .and()
                .authorizeRequests()
                .requestMatchers(CorsUtils::isPreFlightRequest)
                .permitAll()
                //跨域配置结束
                .and()
                .addFilterBefore(loginAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
                .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                .and()
                .requestMatchers().anyRequest()
                .and()
                .anonymous()
                .and()
                .authorizeRequests()
                .antMatchers(
                        "/swagger/**",
                        "/v2/api-docs",
                        "/doc.html",
                        "/swagger-ui.html",
                        "/swagger-resources/**").permitAll()
                .and()
                .authorizeRequests()
                .antMatchers("/**").authenticated();//配置所有访问控制,必须认证过后才可以访问
    }
}
原文  https://segmentfault.com/a/1190000020510147
正文到此结束
Loading...