Spring Security HttpSecurity 構成テスト 質問する

Spring Security HttpSecurity 構成テスト 質問する

antMatchersいくつかのパス (一部fullyAuthenticated()、一部 )を持つ Spring Boot + Spring Security アプリケーションがありますpermitAll()

SecurityConfiguration自分のエンドポイント/api/**(そして最終的には他のエンドポイント)が正しく保護されているかどうかを確認するテストを作成するにはどうすればよいでしょうか?

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    protected void configure(HttpSecurity http) throws Exception {
        http
            //...
            .antMatchers("/api/**").fullyAuthenticated()
    }

}

spring-boot-1.5.2.RELEASE、を使用しますspring-security-core-4.2.2-release

説明1:独自のセキュリティを持つ可能性のあるエンドポイントSecurityConfigurationの 1 つを介して推移的にテストするのではなく、をできるだけ直接的にテストしたいと考えています。/api/**@PreAuthorize

説明2:これに似たものが欲しいですWebセキュリティコンフィギュレータアダプタテスト

説明3:@Autowire理想的には、Spring Security レイヤーで何かをテストしたいと思っていますHttpSecurity

ベストアンサー1

つまり、誰かが変更した場合にそれを検出するテストがあることを確認したいということです.antMatchers("/api/**").antMatchers("/WRONG_PATH/**")?

を使って定義するルールは、それぞれがフィルタのリストを持つ1つ以上のHttpSecurityを設定することになります。(フォームベースのログインに使用される)などの各フィルタは、スーパークラス で定義されたを持ちます。問題は、 がインターフェースであることです。FilterChainProxySecurityFilterChainUsernamePasswordAuthenticationFilterRequestMatcherAbstractAuthenticationProcessingFilterRequestMatcher現在には 12 種類の異なる実装があり、これにはAndRequestMatcherと が含まれるOrRequestMatcherため、マッチング ロジックは必ずしも単純ではありません。そして最も重要なのは にはRequestMatcherメソッドが 1 つしかなくboolean matches(HttpServletRequest request)、実装では構成が公開されないことが多いため、各実装のプライベート構成にアクセスするにはリフレクションを使用する必要がありますRequestMatcher(将来変更される可能性があります)。

このパスをたどり、FilterChainProxyテストに自動配線し、リフレクションを使用して構成をリバース エンジニアリングする場合、実装の依存関係をすべて考慮する必要があります。たとえば、にはWebSecurityConfigurerAdapterデフォルトのフィルター リストがあり、これはリリース間で変更される可能性があり、無効にしない限り、すべてのフィルターを明示的に定義する必要があります。さらに、RequestMatchers時間の経過とともに新しいフィルターが追加される可能性があり、Spring Security のあるバージョンで生成されたフィルター チェーンがHttpSecurity次のバージョンでは若干異なる可能性があります (可能性は低いかもしれませんが、可能性はあります)。

Spring Security 構成の汎用テストを記述することは技術的には可能ですが、決して簡単なことではありません。また、Spring Security フィルターはこれをサポートするように設計されていません。私は 2010 年から Spring Security に幅広く取り組んできましたが、このようなテストが必要になったことは一度もありません。個人的には、これを実装するのは時間の無駄だと思います。その時間を有効に活用するには、セキュリティ レイヤーとビジネス ロジックを暗黙的にテストする統合テストを簡単に記述できるテスト フレームワークを記述する方がはるかに効果的だと思います。

おすすめ記事