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
を設定することになります。(フォームベースのログインに使用される)などの各フィルタは、スーパークラス で定義されたを持ちます。問題は、 がインターフェースであることです。FilterChainProxy
SecurityFilterChain
UsernamePasswordAuthenticationFilter
RequestMatcher
AbstractAuthenticationProcessingFilter
RequestMatcher
現在には 12 種類の異なる実装があり、これにはAndRequestMatcher
と が含まれるOrRequestMatcher
ため、マッチング ロジックは必ずしも単純ではありません。そして最も重要なのは にはRequestMatcher
メソッドが 1 つしかなくboolean matches(HttpServletRequest request)
、実装では構成が公開されないことが多いため、各実装のプライベート構成にアクセスするにはリフレクションを使用する必要がありますRequestMatcher
(将来変更される可能性があります)。
このパスをたどり、FilterChainProxy
テストに自動配線し、リフレクションを使用して構成をリバース エンジニアリングする場合、実装の依存関係をすべて考慮する必要があります。たとえば、にはWebSecurityConfigurerAdapter
デフォルトのフィルター リストがあり、これはリリース間で変更される可能性があり、無効にしない限り、すべてのフィルターを明示的に定義する必要があります。さらに、RequestMatchers
時間の経過とともに新しいフィルターが追加される可能性があり、Spring Security のあるバージョンで生成されたフィルター チェーンがHttpSecurity
次のバージョンでは若干異なる可能性があります (可能性は低いかもしれませんが、可能性はあります)。
Spring Security 構成の汎用テストを記述することは技術的には可能ですが、決して簡単なことではありません。また、Spring Security フィルターはこれをサポートするように設計されていません。私は 2010 年から Spring Security に幅広く取り組んできましたが、このようなテストが必要になったことは一度もありません。個人的には、これを実装するのは時間の無駄だと思います。その時間を有効に活用するには、セキュリティ レイヤーとビジネス ロジックを暗黙的にテストする統合テストを簡単に記述できるテスト フレームワークを記述する方がはるかに効果的だと思います。