2015-07-20 4 views
0

Я пытаюсь использовать Spring Security, но когда я использую логин формы (с правильным именем или паролем или без него), я получаю ошибку 404: http://localhost/HomeAutomation/j_spring_security_check.Весенняя безопасность: страница 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> 

У вас есть идеи, почему это не сработает?

Извините за мой английский. Спасибо заранее.

ответ

1

Конфигурация Java Spring Spring по умолчанию относится к различным URL-адресам, которые представляют собой конфигурацию 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/
  • Вы указываете ряд свойств, которые совпадают с значениями по умолчанию. Например, вам не нужны имя пользователяParameter, passwordParameter, csrf и т. Д.
+0

Не знаете, почему это не было принято, это правильный ответ. Я не понимал, что вам нужно использовать тот же URL-адрес с POST при отправке. Thnks! –

Смежные вопросы