SpringPecurity: @PreAuthorize и @PostAuthorize игнорируются при модульном тестировании с MockMvc.Но это нормально, когда доступ через браузер Почтальона при нормальном запуске приложения
Я использую Spring 4.3 и Spring security 4.2, а не весеннюю загрузку.Я использую MockMvcBuilders.standaloneSetup
только для проверки контроллера.и не хочу использовать webAppContextSetup, чтобы задействовать все приложение для тестирования.
После проверки исходного кода весенней безопасности я обнаружил, что Pre и PostAuthorize проверяют с помощью org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice и org.springframework.security.access.expression.method.ExpressionBasedPostInvocationAdvice.Но контроллер не включается в org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource.
Я думаю, что это вызвано тем, что контроллер не инициализируется Spring, поэтому я пытаюсь зарегистрировать его в BeanFactory, ноон также не работает.
Код тестирования:
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = standaloneSetup(controllers)
.setValidator(validator)
.apply(springSecurity(filterChainProxy))
.alwaysDo(print())
.build();
}
public void itWillFailWhenUpdateOtherOrg() {
CurrentUser user = new CurrentUser();
user.setOrgId(1);
user.setUsername("testuser");
mockMvc.perform(put("/orgs/-1")
.contentType(APPLICATION_JSON)
.content("{\"name\":\"RootOrg\",\"parent\":100}")
.with(user(user))).andExpect(status().isForbidden());
verify(orgService, never()).update(any());
}
Код контроллера:
@PutMapping("/org/{id}")
@PreAuthorize("principal.orgId == #orgDO.parent")
public OrgDO update(@PathVariable Integer id, @RequestBody OrgDO orgDO) {
}
При тестировании код состояния - 200, но не 403.
java.lang.AssertionError: Status
Expected :403
Actual :200
Я ожидаю, что запрос на поставку завершится неудачно и вернет код состояния 403 из-за principal.orgId != #orgDO.parent
.
Не забудьте НЕ включать все классы в контекст Spring, я просто хочу проверитькласс контроллера.
Большое спасибо.