2016-11-01 11 views
9

があります。 私はAngular 2とSpring Frameworkを初めて使用しています。 私は認証ヘッダー(基本認証)で単純なget要求を試みています。プリフライトの応答に無効なHTTPステータスコード401 - Spring

私はSpringブート(1.2.6.RELEASE)を使用しています。これは関連性があります。 CORSの設定は次のようになります。

のXMLHttpRequestが http://localhost:8080/api/login?username=userをロードすることはできません。

@Component 
public class SimpleCorsFilter implements Filter { 

private final Logger log = LoggerFactory.getLogger(SimpleCorsFilter.class); 

public SimpleCorsFilter() { 
    log.info("SimpleCORSFilter init"); 
} 

@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, PUT"); 
    response.setHeader("Access-Control-Max-Age", "3600"); 
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me, authorization, x-auth-token"); 

    chain.doFilter(req, res); 
} 

@Override 
public void init(FilterConfig filterConfig) { 
} 

@Override 
public void destroy() { 
} 

} 

そして、ここではそれがクライアント側

this.headers.append('Authorization', 'Basic dXNlcjphZG1pbg=='); 
    return this.http 
      .get(`http://localhost:8080/api/login?username=${username}`, {headers : this.headers}) 
      .map(response => response.json().data as any); 
} 

私は得続けるから次のようになります。プリフライト の応答が助けてください無効なHTTPステータスコード401

を持って、私は私が欠けているのか分からない... 私はすでにポストの多くの周りにチェックしますがそこに着くことができませんでした...

+0

HTTP 401はあなたの要求があればチェックし、見つからないため、認可を満たすことができないことを意味しますが動作しています –

+0

response.setHeader( "Access-Control-Allow-Credentials"、 "true")を削除できますか?試してみる? –

+0

@ TharsanSivakumar、とにかく感謝、同じ考えを持って –

答えて

7

回避フィルタリングと設定された状態200私はしました角度の2/4のように春ブーツ、春のセキュリティやクライアントとの周りの作業似たような状況になって、誰もが、存在する場合、HTTPメソッドはOPTIONS

if("OPTIONS".equalsIgnoreCase(request.getMethod())) { 
    response.setStatus(HttpServletResponse.SC_OK); 
} else { 
    chain.doFilter(req, res); 
} 
+0

ありがとう@エスワール、私はもうエラーを取得していません。しかし、OPTIONS要求を無視して良い実装ですか?私は本当に知らないので、頼んでいる。 –

+0

リクエストヘッダーを検証し、フィルタなしでステータスコードを送信できます。ブラウザはヘッダーにAuthorizationを送信するたびにプリフライトリクエストを行いますので、発信元を検証してエラーステータスコードを投げるだけです。OPTIONSを無視しても、他のhttpメソッドには影響はありませんが、その実装が良いかどうかはわかりません。 – Eswar

3

です調査結果を掲載しましたhere。短い答えを探している人のために

、あなたは二つのことを設定する必要があります。春ブートによる

  1. を、グローバルCORSを有効にするために推奨される方法は、Spring MVCの中に宣言することで、微と組み合わせますきめ@CrossOrigin構成としては:

    @Configuration 
    public class CorsConfig { 
    
        @Bean 
        public WebMvcConfigurer corsConfigurer() { 
         return new WebMvcConfigurerAdapter() { 
          @Override 
          public void addCorsMappings(CorsRegistry registry) { 
           registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*") 
             .allowedHeaders("*"); 
          } 
         }; 
        } 
    } 
    
  2. その後、春のセキュリティでの作業中に、あなたはそれのようにSpring MVCのレベルで定義された構成を活用できるようにするだけでなく春のセキュリティレベルでCORSを有効にする必要があります:

    @EnableWebSecurity 
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    
        @Override 
        protected void configure(HttpSecurity http) throws Exception { 
         http.cors().and()... 
        } 
    } 
    

乾杯!

+0

このリンクは質問に答えるかもしれませんが、ここに答えの重要な部分を含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](レビュー/低品質の投稿/ 17426158) – khelwood

+0

@khelwoodは答えを更新しましたが、なぜ投票を停止するのですか?カバーで本を判断するようなものですか?私は答えを更新していなかった場合、私は感謝しているだろう。 –

+0

私はdownvoteしませんでした。 – khelwood

0

春のセキュリティガイドのように別のオプション:WebSecurityConfigurerAdapterは(CORSを設定する拡張セキュリティ設定クラスの

)は

protected void configure(HttpSecurity http) throws Exception { 

       http 
         .cors().and().**this will use corsConfigurationSource by** default. 


    so lets define corsConfigurationSource 

    // other criteria 
    } 

**so lets define corsConfigurationSource** 

@Bean CorsConfigurationSource corsConfigurationSource() { 

CorsConfiguration configuration = new CorsConfiguration(); 

configuration.setAllowedOrigins(Arrays.asList("http://myufrontend.com")); 

configuration.setAllowedMethods(Arrays.asList("GET", "POST")); 

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 

source.registerCorsConfiguration("/**", configuration); 





} 
関連する問題