Я тестирую свой AccountContoller с помощью @WebMvcTest.
Запрос GET и Update работают нормально, но DELETE выдает 403 Status.
Все запросы используют @AutenticationPrincipal -
Я смог протестировать Get и Update Requeset, используя
mvc.preform (...). with (аутентификация (appAuth)). andExpect (...), но
УДАЛИТЬ запрос возвращается 403.
Я пытался включить @ContextConfiguration (classes = SecurityConfig.class)
но дошло до того, что @webMvcTest требовал полной настройки и все еще сталкивался с множеством проблем, связанных с моим WebSecurityConfigurerAdapter. Я опубликую свою конфигурацию безопасности, если это необходимо.
Тест:
@RunWith(SpringRunner.class)
@WebMvcTest(AccountController.class)
@ContextConfiguration(classes = {SecurityConfiguration.class})
public class AccountControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private AccountService service;
@Test
public void updateAccountName() throws Exception {
String usrNm = "admin";
AppUser appUser = new AppUser(usrNm, "pass");
mvc.perform(get(Path.getAccoutUrl())
.with(authentication(new AppAuth(appUser, true)))
)
.andExpect(status().isOk());
verify(service, times(1))
.findByUsername(usrNm);
}
@Test
public void deleteAccount() throws Exception {
String usrNm = "admin";
AppUser appUser = new AppUser(usrNm, "pass");
appUser.setAuthority(Authority.ADMIN);
appUser.setState(State.ACTIVE);
mvc.perform(delete(Path.getAccoutUrl())
.with(authentication(new AppAuth(appUser, true)))
)
.andExpect(status().isOk());
verify(service, times(1))
.deleteByUsername(usrNm);
}
@Test
public void getAccountName() throws Exception {
String usrNm = "admin";
AppUser appUser = new AppUser(usrNm, "pass");
mvc.perform(get(Path.USERNAME)
.with(authentication(new AppAuth(appUser, true))))
.andExpect(status().isOk())
.andExpect(content().string(usrNm));
}
}
Контроллер:
@RestController(Path.ACCOUNT)
public class AccountController {
@Autowired
private AccountService service;
@GetMapping(Path.ACCOUNT)
public Account getAccount(@AuthenticationPrincipal AppAuth user) {
return service.findByUsername(user.getName());
}
@PutMapping(Path.ACCOUNT)
public void updateAccountName( @AuthenticationPrincipal AppAuth user,
@RequestBody String newName) {
Account account = service.findByUsername(user.getName());
account.setUsername(newName);
service.save(account);
}
@DeleteMapping(Path.ACCOUNT)
public void deleteAccount(@AuthenticationPrincipal AppAuth user) {
service.deleteByUsername(user.getName());
}
@RequestMapping(method = RequestMethod.GET, value = Path.USERNAME)
public String getAccountName(@AuthenticationPrincipal AppAuth user) {
return user.getName();
}
@RequestMapping(method = RequestMethod.GET, value = Path.LASTCHANGE)
public Date getLastChange(@AuthenticationPrincipal AppAuth user) {
return service.findByUsername(user.getName()).getLastChange();
}
}
Как мне избежать 403? (желательно без использования WebSecurityConfigurerAdapter)