0

REST APIを保護したい。ルールは単純です。Springセキュリティでエンドポイントの認証方法を制限する

  • ユーザーは、エンドポイント/api/authenticateのみHTTP基本認証(無トークン認証を)受け入れるユーザーがAPIにアクセスするために(/api/authenticateから受け取った)トークンを使用することができます/api/**
  • トークンを取得するために /api/authenticateを呼び出す必要があります
  • エンドポイント/api/**/api/authenticateを除く)は、トークン認証(基本認証なし)のみを受け入れます。
  • すべての残りのエンドポイントは公開されており、authe 。

私は実際にこれを使用します。

@Configuration 
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

     @Autowired 
     private TokenAuthenticationProvider tokenAuthenticationProvider; 

     @Override 
     protected void configure(final HttpSecurity httpSecurity) throws Exception { 
      httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
      httpSecurity.headers().disable(); 
      httpSecurity.setSharedObject(TokenAuthenticationProvider.class, this.tokenAuthenticationProvider); 
      httpSecurity.antMatcher("/api/authenticate").httpBasic(); 
      httpSecurity.antMatcher("/api/**").apply(new TokenAuthenticationConfigurer()); 
      httpSecurity.authorizeRequests() 
        .antMatchers("/api/**").authenticated() 
        .anyRequest().permitAll(); 
     } 
    } 

を実際に、私は私の設定が要求を受け入れる/api/authenticateするトークンでリクエストを送信する場合。 /api/authenticate/api/**の一部であるため、これが発生すると思います。だから私はトークン認証のためにこのパスを除外する必要があります。

どうすればいいですか?

EDIT 1

私は.and()流暢なスタイルを使用する場合、結果はまったく同じです。

@Override 
    protected void configure(final HttpSecurity httpSecurity) throws Exception { 
     httpSecurity.setSharedObject(TokenAuthenticationProvider.class, this.tokenAuthenticationProvider); 
     httpSecurity 
       .headers().disable() 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
       .and() 
       .antMatcher("/api/authenticate").httpBasic() 
       .and() 
       .antMatcher("/api/**").apply(new TokenAuthenticationConfigurer()) 
       .and() 
       .authorizeRequests().antMatchers("/api/**").authenticated().anyRequest().permitAll(); 
    } 

EDIT 2

IはSecurityBuilderHttpSecurity)を理解するように、configure(...)方法でantMatcher(...)のすべての呼び出しは、前の呼び出しを上書き。私が見ることができるデバッグログでは、Spring Securityは常に/api/**と要求パスを一致させようと試みますが、もう一度/api/authenticateとは一致しません。私が注文を切り替えると、APIにはもうアクセスすることができなくなりました。ただちに/api/authenticateとなりました。これは、Spring Securityが常に/api/authenticateと一致するようになるためです。

そこで質問です:どのように私は複数のルール登録することができます。

  • /api/authenticate - >HttpBasicConfigurer.http()
  • /api/** - >TokenAuthenticationConfigurer(私のトークン認証が設定され、.apply(...)
+0

あなたは、この問題を解決するために管理したのですか? –

+0

はい。 'WebSecurityConfigurerAdapter'を拡張することで、複数のセキュリティ設定を作成する必要があります。 '/ api/authenticate'の設定と'/api/** 'の設定があります。それらのそれぞれは、所望のセキュリティ機構で構成することができる。 '@ Order'を使ってセキュリティ設定の優先順位を定義する必要もあります。 – baymon

答えて

0

を親の設定を常に上書きし、and()メソッドを使用していない可能性があります:

XMLタグを閉じることに相当するJava Configurationは、and()メソッドを使用して表現されています。これにより、親を構成し続けることができます。あなたがコードを読んでいれば、それも意味があります。私は許可された要求を構成し、フォームのログインを構成し、HTTP基本認証を構成したいと考えています。

http://docs.spring.io/spring-security/site/docs/current/reference/html/jc.html#jc-httpsecurity

+0

私はそれを試みましたが、結果は同じです。 – baymon

関連する問題