私が使用しています:私のコントローラのいずれかで春@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());
}
----解決策----
MockMvc
standaloneSetup
は、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();
}
}
を作成しながら、あなたは手段... – chrylis
言い訳 "を動作しませんでした"
springSecurityFilterChain
を追加する必要があります私は「うまくいきませんでした」とは、管理者権限のない保護されたメソッドに対してget要求を実行していることを意味し、戻り値は予期された403(許可されていない)ではなく200(ok)です。 – user1337'mockMvc'の設定方法を示してください。 – chrylis