私は、デフォルトではパスワードとして春のユーザ名「ユーザー」として使用して、セキュリティおよびテストを使用しますが@PreAuthorizeではありませんよホームコントローラ春のセキュリティ+春のブートテストコントローラ
@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!";
}
をテストしようとしています結果
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@PreAuthorize("hasRole('ADMIN')")
public class HomeControllerTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
@WithMockUser(username = "user", password = "test", roles = "ADMIN")
public void home() throws Exception {
String body = this.restTemplate.getForObject("/", String.class);
assertThat(body).isEqualTo("Hello World!");
}
}
作業
期待される結果:
< "[Hello Worldの!]">
実際の結果:
< "{" タイムスタンプ ":1501100448216、" ステータス ":401、" エラー ":"無許可 " "メッセージ": "全 認証がこのリソースにアクセスするために必要とされる"、 "パス": "/"}]">
私は何かが足りないのですか?
@TestExecutionListeners(mergeMode = MergeMode.MERGE_WITH_DEFAULTS, listeners = {
WithSecurityContextTestExecutionListener.class
})
そして、次の依存関係をあなたはそれを持っていない場合:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
春のセキュリティは存在しない余分なリスナーを必要とし、あなたのテストクラスに以下を追加する
あなたは '@ WithMockUser'を使用して実際のコントローラを起動していますここでは寂しい。これはコントローラ上で 'home()'メソッドを直接呼び出す場合にのみ有効です。あなたがログインのための基本的な認証設定を持っていると仮定すると、あなたの要求と共に信任状を送るべきです。また、テストケースの '@ PreAuthorize'は何も達成できません。 –