關於Spring Security OAuth2 中 CORS 跨域正解

  1. 跨域是如何產生的?
    跨域則是是同源策略致使的html

    • 什麼事同源策略

同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,若是缺乏了同源策略,則瀏覽器的正常功能可能都會受到影響。能夠說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。
*同源策略,它是由Netscape提出的一個著名的安全策略。
*如今全部支持JavaScript 的瀏覽器都會使用這個策略。
*所謂同源是指,域名,協議,端口相同
*當一個瀏覽器的兩個tab頁中分別打開來 百度和谷歌的頁面
*當瀏覽器的百度tab頁執行一個腳本的時候會檢查這個腳本是屬於哪一個頁面的,
*即檢查是否同源,只有和百度同源的腳本纔會被執行。
*若是非同源,那麼在請求數據時,瀏覽器會在控制檯中報一個異常,提示拒絕訪問。java

  1. 跨域集中解決方案nginx

    • 經過nginx代理
      nginx很簡單便可處理,此問着重講Spring Security的解決方案web

      • 經過服務器處理
      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();//配置全部訪問控制,必須認證事後才能夠訪問
    }
}
相關文章
相關標籤/搜索