最近、次のクラスを使用してSpring SecurityをSpring Bootプロジェクトに追加しました。
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MySecurityConfig {
}
その結果、デフォルトでは、私のすべてのURLが認証と自己生成パスワードで保護されるようになりました。
問題は、コントローラーのユニットテストに使用した@WebMvcTestクラスのすべてのテストです。
@RunWith(SpringRunner.class)
@WebMvcTest(SomeController.class)
public class SomeControllerTest {...}
認可の欠如のために今どこでも失敗しています。
質問:@Testメソッドに承認を無視して、以前と同じように成功し続けるように指示できますか?
@ EnableWebSecurity構成クラスが特定の@ WebMvcTestユニットテストクラスで選択されないようにするにはどうすればよいですか?
すでに実施されているテストを引き続き実行できるようにして、後で認証機能を個別にテストできるようにしたいと思います。
これまでのところ、セキュリティ構成を除外するために、テストクラスでネストされた構成クラスを使用しようとしました。
@RunWith(SpringRunner.class)
@WebMvcTest(SomeController.class)
public class SomeControllerTest {
@Configuration
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class})
static class ContextConfiguration { }
....}
しかし、動作しないようです。
[〜#〜] note [〜#〜]:私はSpring Boot 1.5.8を使用しています
@WebMvcTestアノテーションでsecure = falseを設定できます。テストでSpring Security MockMvc自動構成をスキップします
@WebMvcTest(controllers = SomeController.class, secure = false)
public class SomeControllerTest {
Spring Security 4以降では、@WithMockUser
アノテーションが非常に便利です。 @PreAuthorizeまたは@PostAuthorizeで注釈が付けられたSpringセキュリティメソッドをテストするためのモックユーザーとパスワードを提供します。テストメソッドに@WithMockUser
で注釈を付けるだけです。ユーザーのデフォルトの役割はUSER
です。デフォルトのユーザー名とロールも上書きできます。
//default
@Test
@WithMockUser
public void getProfile() {
//your test here
}
//with username and roles
@Test
@WithMockUser(username = "john", roles={"ADMIN"})
public void getProfile() {
//your test here
}
注:このアノテーションはクラスに使用できます。
@WithMockUser(username = "john", roles={"ADMIN"})
public class UsersAdminSecurityTest {
}