2017-08-08 8 views
0

JWTトークンを使用して休止/ステートレスAPIを保護するためにスプリングセキュリティを使用しようとしています。私が見てきた研究から、春のセキュリティセッション管理をオフにしてから、ユーザーのログインやjwtトークンのチェックを行うカスタムフィルタを追加する必要があります。スプリングセキュリティとスプリングブートを使用したフィルタの順序付け

私が気にする問題は、フィルタを追加すると、必要なエンドポイントだけでなく、すべてのフィルタが実行されることです。私は、ログインエンドポイントを開くだけでなく、保護する必要のない登録と参照データを容易にするいくつかのものを開く必要があります。

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .csrf().disable() 
       .authorizeRequests() 
       .antMatchers("/api/user").permitAll() 
       .anyRequest().authenticated().and() 
       .addFilterBefore(new StatelessAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 
     ; 
    } 
} 

すべてのStatelessAuthenticationFilterは「ここに」印刷されます。私はあなたがlocalhost:8080/api/orderに行くときにそのメッセージプリントを見ることを期待しているだけですが、localhost:8080/api/userに行くと表示されます。

この現象を起こす方法はありますか?

答えて

0

構成方法によって、HttpSecurityがユーザーエンドポイントを含むすべてのURLに適用されます。 authorizeRequests() .antMatchers("/api/user").permitAll()行は、認証フィルタが呼び出されているときの "user"エンドポイントを防ぎません。 これは、認証されたすべてのユーザーが呼び出すことができます。 エンドポイントにのみ「オーダー」するためにフィルターを適用する必要があります。このように: http .requestMatchers().antMatchers("/api/user") .and() .authorizeRequests()

+0

かかわら

のconfigure(WebSecurity社)メソッドをオーバーライドしてしまった、それが働きました!また、configure(Websecurity)メソッドをオーバーライドし、ignoring()メソッドを使用してエンドポイントを無視できることも確認しました。どの方法が好ましいかわからない。 – tfecw

0

@ tsolakpさんの答えは私のために働いています。私はそれを試してみた

@Override 
    public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/api/user"); 
    } 

@Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http 
     .csrf().disable() 
     .authorizeRequests() 
     .anyRequest().authenticated().and() 
     .addFilterBefore(new StatelessAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 
    ; 
    } 
関連する問題