2017-07-26 19 views
2

私は、デフォルトではパスワードとして春のユーザ名「ユーザー」として使用して、セキュリティおよびテストを使用しますが@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> 

春のセキュリティは存在しない余分なリスナーを必要とし、あなたのテストクラスに以下を追加する

+1

あなたは '@ WithMockUser'を使用して実際のコントローラを起動していますここでは寂しい。これはコントローラ上で 'home()'メソッドを直接呼び出す場合にのみ有効です。あなたがログインのための基本的な認証設定を持っていると仮定すると、あなたの要求と共に信任状を送るべきです。また、テストケースの '@ PreAuthorize'は何も達成できません。 –

答えて

1

てみてくださいデフォルトではテストではmergeモードの@TestExecutionListeners注釈を指定することでspringを追加する必要がありますので、追加するリスナーと現在のリストのリスナーをマージします - この場合はWithSecurityContextTestExecutionListener

+0

ありがとうございますが動作しませんでした。同じ結果を受け取りました:/ –

+0

'@ WithMockUser'の' roles'に 'ROLE_ADMIN'を追加してみてください。デフォルトで春のセキュリティは接頭辞 'ROLE'をチェックします(しかし' @ PreAuthorize'では 'ADMIN'としてください)。 – Tom

0

(アプリケーションの起動時にINFOレベルで印刷された「ユーザー」のユーザー名とランダムなパスワード、)デフォルトAuthenticationManagerは、単一のユーザーを持っている

ので、あなたはあなたが

doc、invaildパスワードを使用カスタムユーザを作成して再度テストすることができます

@Bean 
public UserDetailsService userDetailsService() throws Exception { 
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); 
    manager.createUser(User.withUsername("admin").password("passAdmin").roles("USER", "ADMIN").build()); 
    return manager; 
} 
関連する問題