springboot+spring-security+ajax+前後端分離解決Authorzation要求ヘッドクロスドメイン問題

20825 ワード

security+ajax+前後端分離解決Authoriation要求ヘッドクロスドメイン問題
背景
     springboot+spring-security+oauth2  
              。()
         。  token         。                。
問題
前後端分離の最初に解決したいのはクロスドメイン問題です。そのために私はもう楽屋でバーンを起こしました。
	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 ConfigurationBeans {

    @Bean
	    public CorsFilter corsFilter() {
	        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
	        final CorsConfiguration corsConfiguration = new CorsConfiguration();
	        corsConfiguration.addAllowedOrigin("*");
	        corsConfiguration.setAllowCredentials(true);
	        corsConfiguration.addAllowedHeader("*");
	        corsConfiguration.addAllowedMethod("*");
	        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
	        return new CorsFilter(urlBasedCorsConfigurationSource);
	    }
	}
sercuryの配置もこのコードを加えなければなりません。
protected void configure(HttpSecurity http) throws Exception {
        http.cors()
                .and()
                .csrf()
                .disable();
        //   http     
}
ajaxコードを添付します
	var data = getData();
	var auth = getToken();
	var returnData = null;
	 $.ajax({
      type: api.type,
      url: webDomain + api.url,
      data: data,
      async: false,
      contentType: false,
      processData: false,
      beforeSend : function(request) {
        request.setRequestHeader("Authorization",auth);
      },
      success: function (result) {
        console.log(2)
        if (result.code == 200) {
          returnData = successFunction(result);
        } else {
          alert(result.msg)
        }
      },
      error: function (jqXHR) {
        console.log(jqXHR)
        alert("    :" + jqXHR.status);
      }
    });
  }
しかし、ログインなどは必要ないです。tokenのインターフェースが必要ではないです。他のインターフェースを呼び出しても、めちゃくちゃな顔をしています。tokenの異常を見つけられません。そのために、ドメインをまたいで配置した場合、Authoriationの要求を許可していませんでした。つまり上のこのJavaコードの構成が間違っています。
	corsConfiguration.addAllowedHeader("*");
このaddAllowedHeaderの再構成を試みました。
 corsConfiguration.addAllowedHeader("Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization");
 corsConfiguration.addAllowedHeader("Authorization,*");
 corsConfiguration.addAllowedHeader("*,Authorization");
例外なく失敗した。問題を見直してみます。このクロスドメインフィルタの優先度よりも、sprigsecurityのフィルタチェーンの優先度が高い可能性がありますか?フロントの弟がドッキングを待っていますので、そんなに多くの時間を考えずに、簡単で乱暴な形で解決しました。本当の原因を深く追究することに間に合わないで、直接beanの形式を採用しないでドメインを跨ぐ処理をして、filterの形式を実現することを採用して、そしてInteger.MIN_を通じて(通って)VALE指定優先度が一番高いです。

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@Configuration
@Order(Integer.MIN_VALUE)
@Slf4j
public class CustomCorsFilter implements Filter {

   @Override
   public void destroy() {

   }

   @Override
   public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
           throws IOException, ServletException {

       HttpServletRequest request = (HttpServletRequest) req;
       HttpServletResponse response = (HttpServletResponse) res;
       log.info("Authorization={}",request.getHeader("Authorization"));
       Enumeration<String> es = request.getHeaderNames();
       String s = "";
       while (es.hasMoreElements()){
           s = es.nextElement()+","+s;
       }
       log.info(s);
       response.setHeader("Access-Control-Allow-Origin", "*");
       response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");
       response.setHeader("Access-Control-Max-Age", "3600");
       response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization");
       chain.doFilter(req, res);

   }

   @Override
   public void init(FilterConfig arg0) throws ServletException {

   }

}