Подтвердить что ты не робот

Spring Тесты интеграции MVC с Spring Безопасность

Я пытаюсь проверить мою страницу входа, используя mvc-test. Я работал очень хорошо, прежде чем добавил spring безопасность.

Мой код:

 mockMvc.perform(
     post("j_spring_security_check")
                    .param(LOGIN_FORM_USERNAME_FIELD, testUsernameValue)
                    .param(LOGIN_FORM_PASSWORD_FIELD, testPasswordValue))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(model().attribute(LOGIN_PAGE_STATUS_VALUE, LOGIN_PAGE_STATUS_FALSE_INDICATOR));

В тестовом классе добавлены правильные аннотации:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })

Мой фильтр определен (в web.xml):

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Когда я пытаюсь добавить web.xml в @ContextConfiguration, он терпит неудачу, когда я его удаляю, я получаю исключение:

java.lang.AssertionError: Status expected:<200> but was:<405>

Есть ли способ добавить DelegatingProxyFilter для проверки контекста с конфигурацией, определенной в моем security-context.xml, чтобы она работала? Я пробовал несколько учебников с инъекцией FilterProxyChain, но он не работает в моем случае.

Может кто-нибудь мне помочь? Спасибо заранее

4b9b3361

Ответ 1

ОБНОВЛЕНИЕ: Spring Безопасность 4+ предоставляет возможность интеграции с MockMvc. Чтобы использовать его, вы можете использовать apply(springSecurity()), как показано ниже:

import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class MockMvcSecurityTests {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    @Before
    public void setup() {
        mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }
    ...
}

Оригинальный ответ

Я не уверен, что вы подразумеваете под "Когда я пытаюсь добавить web.xml в @ContextConfiguration, это не сработает", однако вы можете использовать Spring Test MVC для проверки безопасности Spring. Существует очень хороший пример, описанный в проекте spring -test-mvc.

Основной контур выглядит примерно так:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })
public class MyTests {

    @Autowired
    private FilterChainProxy springSecurityFilterChain;

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
            .addFilters(this.springSecurityFilterChain).build();
    }
}

Идея состоит в том, что вы @Autowire FilterChainProxy (что делегат DelegatingProxyFilter делегирует), и инструктируйте MockMvc использовать FilterChainProxy.

ПРИМЕЧАНИЕ spring -test-mvc интегрирован в spring -test-3.2 + и отдельный проект для Spring 3.1.x, поэтому вы можете использовать пример довольно взаимозаменяемо ( spring -test-mvc не поддерживает @WebAppConfiguration и вместо этого должен использовать WebContextLoader).

Ответ 2

Добавить в pom.xml

<repository>
    <id>spring-snaspho</id>
    <url>http://repo.springsource.org/libs-milestone/</url>
</repository>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>4.0.0.M1</version>
</dependency>

и используйте org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors для запроса авторизации. См. Пример использования https://github.com/rwinch/spring-security-test-blog (https://jira.spring.io/browse/SEC-2592)