4

ログイン jsp フォームと spring security xml 構成は次のようになります。

<spring:url value="/j_spring_security_check" var="login" />
<form action="${login}" method="POST">
<fieldset>
    <legend>Login</legend>
        <input type="text" name="j_username" id="username" placeholder="Usename"/>
        <input type="text" name="j_password" id="password" placeholder="Password"/>
        <input type="submit" value="Login" />
</fieldset>
</form>
...
<security:form-login login-page="/public/authentication/login.htm"
     login-processing-url="/j_spring_security_check"
     default-target-url="/public/index.htm"
     authentication-failure-url="/public/authentication/login.htm?authenticationNok=1"/>

フォーム送信のテストは次のとおりです。

@Test
public void testLoginPostController() throws Exception {
    Account account = new AccountBuilder("test", "test", "test@gmail.com", Address.FAKE_EMPTY_ADDRESS4TESTS)
            .build();
    this.mockMvc.perform(post("/j_spring_security_check").param("j_username", account.getUsername()).param("j_password", "test"))
            .andDo(print())
            .andExpect(status().isMovedTemporarily())
            .andExpect(view().name("redirect:/public/index.htm"));
}

しかし、私は得ています:java.lang.AssertionError: Status expected:<302> but was:<404>

ブラウザでログインページを開くと、生成されたフォームが次のようになっていることがわかります。

<form action="/SpringMvcExample/j_spring_security_check" method="POST">

OK、テストを次のように変更しようとしました:

this.mockMvc.perform(post("/SpringMvcExample/j_spring_security_check").param("j_username", account.getUsername()).param("j_password", "test"))

しかし、同じ結果が得られました。同時に、ブラウザでログインフォームを送信すると、テストで予想されるように、public/index.htmページにリダイレクトされます。

私は何を間違っていますか?

4

2 に答える 2

7

更新: Spring Security 4 は、公式のテスト サポートを追加しました。MockMvc を使用したテストについて詳しく説明するセクションがあります。

Spring Security Filter を MockMvc に追加していないようです。例えば:

public class MyTests {

    @Autowired
    private FilterChainProxy springSecurityFilterChain;

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

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

    @Test
    public void testLoginPostController() throws Exception {
        Account account = new AccountBuilder("test", "test", "test@gmail.com", Address.FAKE_EMPTY_ADDRESS4TESTS)
                .build();
        this.mockMvc.perform(post("/j_spring_security_check").param("j_username", account.getUsername()).param("j_password", "test"))
                .andDo(print())
                .andExpect(status().isMovedTemporarily())
                .andExpect(view().name("redirect:/public/index.htm"));
    }

}

これが発生する理由は、現在 MockMvc が Spring MVC 構成のみを認識しており、フィルター (つまり、FilterChainProxy) を認識していないためです。ユーザー名とパスワードの検証 (つまり、/j_spring_security_check の処理) は、Spring MVC に送信される前に FilterChainProxy 内で行われ、それを含めていないため、404 が返されます。

于 2013-12-05T14:08:54.873 に答える