Spring安全:j_spring_security_check页面未找到
问题描述:
我试图使用Spring Security,但是当我使用表单登录(有或没有正确的用户名/密码)时,我得到一个404错误:http://localhost/HomeAutomation/j_spring_security_check。Spring安全:j_spring_security_check页面未找到
这里我的文件:
SecurityConfig.java:
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("greg").password("123").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/home/**").access("hasRole('ROLE_USER')")
.and()
.formLogin().permitAll().loginPage("/index").failureUrl("/index?loginError=1")
.defaultSuccessUrl("/home", true).successHandler(new LoginSuccessHandler())
.usernameParameter("username").passwordParameter("password")
.and()
.logout().logoutSuccessUrl("/index?logout=1")
.and()
.csrf();
}
}
SpringMvcInitializer.java
public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { AppConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
SpringSecurityInitializer.java
public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer{
//nothing to do
}
的index.jsp:
<c:if test="${not empty loginError}">
<div class="errorMsg">${loginError}</div>
</c:if>
<form name='loginForm' action="<c:url value='j_spring_security_check' />" method='post'>...</form>
你知道为什么这不起作用吗?
对不起,我的英语。 预先感谢您。
答
Spring Security的Java配置默认为不同的XML配置。这意味着你已经指定了:
http
.formLogin()
.permitAll()
.loginPage("/index")
.failureUrl("/index?loginError=1")
.defaultSuccessUrl("/home", true)
.successHandler(new LoginSuccessHandler())
.usernameParameter("username")
.passwordParameter("password")
Spring Security将使用GET /索引重定向来请求登录页面(与loginPage属性的值相同)。 Spring Security将监视POST/index以获取要提交的用户名和密码(在HTTP参数用户名和密码上)。
如果你想改变这一点,你可以使用:
http
.formLogin()
// MODIFY HERE
.loginProcessingUrl("/j_spring_security_check")
.permitAll()
.loginPage("/index")
.failureUrl("/index?loginError=1")
.defaultSuccessUrl("/home", true)
.successHandler(new LoginSuccessHandler())
.usernameParameter("username")
.passwordParameter("password")
其他注意事项:
- 这使得Java的配置容易得多,如果你遵循格式一些约定阅读。请参阅https://spring.io/blog/2013/07/11/spring-security-java-config-preview-readability/
- 您正在指定许多与默认设置相同的属性。例如,您不需要usernameParameter,passwordParameter,csrf等
不确定为什么这不被接受,这是正确的答案。我没有意识到在提交时需要使用与POST相同的URL。 Thnks! –