Как включить GlobalMethodsSecurity при модульном тестировании с MockMvc из standaloneSetup - PullRequest
0 голосов
/ 18 апреля 2019

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, я просто хочу проверитькласс контроллера.

Большое спасибо.

...