web-dev-qa-db-ja.com

Spring MVCとSpring Securityの統合テスト

Mvc-testを使用してログインページをテストしようとしています。春のセキュリティを追加する前は、かなりよく働いていました。

私のコードは:

 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>

@ContextConfigurationにweb.xmlを追加しようとすると失敗し、削除すると例外が発生します。

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

DelegatingProxyFilterを追加して、security-context.xmlで定義された構成でコンテキストをテストし、機能させる方法はありますか? FilterProxyChainを注入するチュートリアルをいくつか試しましたが、私の場合は機能しません。

誰かが私を助けてくれますか?前もって感謝します

26
wojtek

[〜#〜] update [〜#〜]:Spring Security 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();
    }
    ...
}

元の回答

「@ContextConfigurationにweb.xmlを追加しようとすると失敗する」という意味がわかりませんが、Spring Test MVCを使用してSpring Securityを検証できます。非常に良い 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();
    }
}

アイデアは、あなたが@AutowireFilterChainProxyDelegatingProxyFilterが委任するもの)とMockMvcFilterChainProxyを使用するように指示することです。

[〜#〜]注[〜#〜]spring-test-mvcは、spring-test-3.2 +とSpring 3.1の個別のプロジェクトに統合されています.xなので、この例はかなり同じ意味で使用できます(spring-test-mvcは@WebAppConfigurationをサポートしておらず、代わりにWebContextLoaderを使用する必要があります)。

58
Rob Winch

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-bloghttps://jira.spring.io/browse/SEC-2592

2
GKislin