2016-10-17 3 views
1

私が使用しています:私のコントローラのいずれかで春@WithMockUserとrequest.IsUserInRole()

request.IsUserInRole("ADMIN") 

を要求に対する応答を決定します。

@Mock 
private HttpServletRequest httpRequest; 

とスプリングス注釈@WithMockUserを使用する:

@Test 
@WithMockUser(roles={"USER, ADMIN"}) 
public void getAccountsTest() throws Exception {...} 

の両方が動作しませんでした私のような私のテストで要求を嘲笑してみました。

質問1:JUnitテストでrequest.IsUserInRole("ADMIN")をどうすれば偽装できますか?

質問2:@WithMockUserにはどのような影響がありますか?request.IsUserInRole("ADMIN")? 、

@Test 
@WithMockUser(username = "user", roles={"USER"}) 
public void getAccountsReturnForbiddenTest() throws Exception { 
    mockMvc.perform(get("/accounts/")) 
     .andExpect(status().isForbidden()); 
} 

403を返すべき:

おかげで、宜しく

----編集----

は、私がテストメソッドを持っていることを意味し、 "動作しませんでした"

@RequestMapping(method=RequestMethod.GET) 
@PreAuthorize("hasRole('ADMIN')") 
public ResponseEntity<PagedResources<AccountResource>> getAccounts(...){...} 

しかし、要求は200、OKを返します。

また、私はSpring Boot 1.4.1を使用しています。

----編集2 ----

私のJUnitテストクラス:AbstractControllerTestと

@Transactional 
@ContextConfiguration 
public class AccountControllerTestDoc extends AbstractControllerTest { 

    @InjectMocks 
    private AccountController accountController; 

    @Mock 
    private AccountService accountService; 

    private String uriBase = ""; 

    @Before 
    public void setup() { 
     // Initialize Mockito annotated components 
     MockitoAnnotations.initMocks(this); 
     // Prepare the Spring MVC Mock components for standalone testing 
     setup(accountController); 
    } 

    @Test 
    @WithMockUser(username = "user", roles={"USER"}) 
    public void getAccountsReturnForbiddenTest() throws Exception { 
     String uri = uriBase + "/accounts"; 
     mockMvc.perform(get(uri)) 
      .andExpect(status().isForbidden()); 
    } 

} 

@WebAppConfiguration 
public abstract class AbstractControllerTest extends AbstractTest { 

    protected MockMvc mockMvc; 

    @Autowired 
    protected WebApplicationContext wac; 

    protected void setup() { 
     mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); 
    } 

    protected void setup(BaseController controller) { 
     mockMvc = MockMvcBuilders.standaloneSetup(controller)) 
       .build(); 
    } 
} 

とAbstractTest:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest 
public abstract class AbstractTest { 

    protected Logger LOG = LoggerFactory.getLogger(this.getClass()); 

} 

----解決策----

MockMvcstandaloneSetupは、Webアプリケーションのコンテキストを認識していないため、セキュリティフィルタチェーンを認識していません。セキュリティの側面をテストできるようにするには、Webアプリケーションコンテキストとセキュリティフィルタチェーンを使用してMockMvcを設定する必要があります。ここで

が私の今働いて解決策ですが、私はAbstractControllerTest編集:

@WebAppConfiguration 
public abstract class AbstractControllerTest extends AbstractTest { 

    protected MockMvc mockMvc; 

    @Autowired 
    protected WebApplicationContext wac; 

    @Autowired 
    FilterChainProxy springSecurityFilterChain; 

    protected void setup() { 
     mockMvc = MockMvcBuilders 
      .webAppContextSetup(wac) 
      .addFilters(springSecurityFilterChain) 
      .build(); 
    } 

    protected void setup(BaseController controller) { 
     mockMvc = MockMvcBuilders.standaloneSetup(controller)) 
       .build(); 
    } 
} 
+0

を作成しながら、あなたは手段... – chrylis

+0

言い訳 "を動作しませんでした" springSecurityFilterChainを追加する必要があります私は「うまくいきませんでした」とは、管理者権限のない保護されたメソッドに対してget要求を実行していることを意味し、戻り値は予期された403(許可されていない)ではなく200(ok)です。 – user1337

+0

'mockMvc'の設定方法を示してください。 – chrylis

答えて

2

MockMvc

protected MockMvc mockMvc; 

@Autowired 
protected WebApplicationContext wac; 

@Autowired 
protected Filter springSecurityFilterChain; 

protected void setup() { 
    mockMvc = MockMvcBuilders 
    .webAppContextSetup(wac) 
    .addFilters(springSecurityFilterChain) 
    .build(); 
} 
+0

答えをありがとう! MockMvcのスタンドアロンセットアップに関する背景については、http://stackoverflow.com/a/34316901/3139759からもう少し詳しく説明しました。 – user1337

関連する問題