私はあなたに2つの答えを持っています。私は前に両方をしました。
現在、使用しているアプローチは、Springセキュリティフィルタチェーンなしでコントローラ/サービスレベルでテストすることです。発見したように、これはあなた自身がThreadLocal SecurityContextを管理する必要があることを意味します。 通常、JUnitテストの前に何かしたいときは、@Before注釈付きメソッドの中に入れます。
@Before
public void before() {
UserDetails userDetails = userDetailsService.loadUserByUsername(name);
Authentication token = new UsernamePasswordAuthenticationToken(userDetails,
password, userDetails.getAuthorities());
Authentication authentication = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
と我々は
@After
public void test() {
SecurityContextHolder.getContext().setAuthentication(null);
}
このアプローチは動作しますが、それは二つの主要な欠点を持っている@After使用クリーンアップ。それはSpringのフィルタチェーンをチェックせず、コントローラのリクエストルーティングをチェックしません - このようなテストを書くのをやめました。ウェブサーバを使わずに完全なウェブスタックをテストする方法がはるかに優れているからです。
新しい友達MockMvcにようこそ! Web層全体をテストするSpring Testを設定することができます。これにより、資格が間違っている場合を除いて、ユーザーがログインにリダイレクトされたことを確認できます。また、無効なJSONを送信すると正しい400 Bad Inputが返されることを確認します。
まず、MockMvcのマニュアルを読むことをお勧めします。あなたは基本的に精通しているいったんhere
私はお詫びしますが、私はあなたが私の質問を誤解していると思います(私は十分ではないかもしれません)。これは私のメソッド内にあるコードで、このコード(私の質問にあるコード)をテストするテストを書く必要があります。言い換えれば、私はこのコードが適切な認証を実行することを確認するテストを書く必要がありますが、実際には必ずしも認証である必要はありません。ここで重要なのは、コード内の新しい演算子と静的オブジェクトの存在です。 – user5080246
私はあなたの質問に間違いがありますが、あなたが本当に奇妙なユースケースを持っているか、あなたが間違った方法でSpringセキュリティを使用しています。あなたは '' '' SecurityContextHolder.getContext()。setAuthentication() '' 'を呼び出すように、Springが呼び出す' '' AuthenticationProvider''(そしておそらく '' 'UserDetailsService''')を実装することになっています。フィルタチェーンが完了したとき。 –
あなたは正しいです。私は手動で私のコントローラ(パスワードでユーザ名を受け取った)で認証しようとしています。 OpenId認証は私のためには機能しません。私はフォームを持っていないので、フォームのログインを使用できません(これは純粋にRESTベースのものです)、ブラウザには資格情報の入力フォームが表示されないのでBasic認証を使用できません(認証失敗時)。だから私は自分の認証を実装する必要があります。私はおそらくAuthProviderを使うべきですが、私はそれを使う方法を理解していません。私はドキュメンテーションの理解から、AuthenticationManagerのように機能します。あなたは正しい方向に私を振りかけることができますか? – user5080246