Beim Testen der Formularauthentifizierung mit der folgenden Konfiguration in Spring Security ist ein 404-Fehler aufgetreten.
POST ---------------------------------> Formularbildschirm AuthenticationProvider ·Nutzername ・ Passwort <================================== Nutzerinformation
SecurityConfig.java
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/webjars/**", "/css/");
}
@Override
protected void configure(HttpSecurity http) {
http.authorizeRequests()
.antMatchers("signin").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginProcessingUrl("/authentication")
.loginPage("signin")
.failureUrl("signin" + "?error")
.successForwardUrl("/hoge/list")
.failureForwardUrl("/authenticationError")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutSuccessUrl("signin");
}
TestClass.java
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = HogeApplication.class)
public class TestClass {
@Before
public void Anfrage vorbereiten() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.build();
}
@Test
public void Mit Anforderungs-URL authentifizieren() throws Exception {
ResultActions result = mvc.perform(
MockMvcRequestBuilders.post("/authentication")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("username",Benutzerkonto)
.param("password",Passwort)
);
result.andExpect(status().isOk())
.andExpect(forwardedUrl("/hoge/list"));
}
}
Behauptung Ergebnisse java.lang.AssertionError: Status Expected :200 Actual :404
Nehmen Sie die folgenden zwei Problemumgehungen.
Unter Anwendung der obigen Ausführungen lautet die Testklasse wie folgt.
TestClass.java
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = HogeApplication.class)
public class TestClass {
@Before
public void Anfrage vorbereiten() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity()) //Wenn dies nicht angewendet wird, ist es 404, auch wenn csrf gesetzt ist.
.build();
}
@Test
public void Mit Anforderungs-URL authentifizieren() throws Exception {
ResultActions result = mvc.perform(
MockMvcRequestBuilders.post("/authentication")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.with(csrf())
.param("username",Benutzerkonto)
.param("password",Passwort)
);
result.andExpect(status().isOk())
.apply(springSecurity()) //Wenn dies nicht angewendet wird, ist es 404, auch wenn csrf gesetzt ist.
.andExpect(forwardedUrl("/hoge/list"));
}
}
Offizielle Dokumentation erwähnt ebenfalls csrf (), veröffentlicht jedoch ausdrücklich Der Benutzername und das Kennwort wurden in der folgenden Implementierung nicht ohne Aufforderung an die Serverseite übergeben. Möglicherweise stimmt etwas nicht, aber ich weiß es nicht. .. ..
TestClass.java
public class TestClass {
Methoden, die den öffentlichen Parameter nicht übergeben() {
ResultActions result2 = mvc.perform(formLogin("/authentication")
.user(Benutzerkonto).password(Passwort));
result2.andExpect(status().isOk())
.andExpect(forwardedUrl("/clients/list"))
.andDo(MockMvcResultHandlers.print());
ResultActions result3 = mvc.perform(MockMvcRequestBuilders.post("/authentication")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.with(csrf())
.with(user(Benutzerkonto).password(Passwort)));
result3.andExpect(status().isOk())
.andExpect(forwardedUrl("/clients/list"))
.andDo(MockMvcResultHandlers.print());
}
}
Das Ergebnis war das gleiche mit csrf (). AsHeader ().
Wenn springSecurity () nicht angewendet wird, ist es 404, auch wenn csrf () in MockMvcRequestBuilders # post festgelegt ist.