2014-12-14 18 views
7

Ecco il mio WebAppInitializer:Primavera di sicurezza/j_spring_security_check Not Found 404

@Configuration 
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[] { AppConfig.class, WebSecurityConfig.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[] { WebConfig.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 
} 

Ecco il mio Config Sicurezza:

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailsService); 
    } 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/resources/**"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     // @formatter:off 
     http.authorizeRequests() 
       .antMatchers("/signup", "/about").permitAll() 
       .antMatchers("/admin/**").hasRole("ADMIN") 
       .anyRequest().authenticated() 
       .and().formLogin().loginPage("/login").defaultSuccessUrl("/home").failureUrl("/error").permitAll() 
       .and().httpBasic(); 
     // @formatter:on 
    } 

} 

E questo è il mio login.html (ad esempio html da thymeleaf):

<form th:action="@{/j_spring_security_check}" method="post"> 
    <label for="j_username">Username</label>: 
    <input type="text" id="j_username" name="j_username" /> <br /> 

    <label for="j_password">Password</label>: 
    <input type="password" id="j_password" name="j_password" /> <br /> 

    <input type="submit" value="Log in" /> 
</form> 

Quando faccio clic su accesso, viene visualizzato questo errore:

HTTP ERROR 404 

Problem accessing /j_spring_security_check. Reason: 

    Not Found 

Come posso risolvere questo errore? Ho cercato spesso su google, ma non ho ancora avuto successo. (Sì, io non uso alcun xml.)

risposta

9

Ho creato questo, e funziona ora:

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; 

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 

} 

Questo attiva la SpringSecurityFilterChain apperently.

Ho dovuto anche passare da @EnableWebSecurity a @EnableWebMvcSecurity a causa di un errore CSRF. Come nel doc di rigidezza è indicato:

... La ragione è che la Primavera di sicurezza protegge contro CSRF attakcks e non ci sono token CSRF includono nella nostra richiesta. Aggiornare la nostra configurazione per utilizzare l'annotazione @EnableWebMvcSecurity che eseguirà lo come @EnableWebMvcSecurity e fornirà l'integrazione con lo Spring MVC Spring. Tra le altre cose, sarà garantire la nostra CSRF token è incluso automaticamente nei nostri moduli quando si utilizza Thymleaf 2.1+ o primavera taglibs MVC ...

anche grazie M. Deinum per il suo commento. Spring ha recentemente cambiato/j_spring_security_check/j_password/j_username in/login/password/nome utente apparentemente.

+0

In alternativa a quanto sopra è quello di inizializzare il filtro a livello di programmazione. IE: FilterRegistration.Dynamic springSecurityFilterChain = container.addFilter ("springSecurityFilterChain", DelegatingFilterProxy.class); springSecurityFilterChain.addMappingForUrlPatterns (null, false, "/ *"); Per me questo approccio ha più senso o potresti aggiungerlo alla tua applicazione xml. Fa la stessa cosa, avere una classe vuota sembra sbagliata e probabilmente verrà cancellata in futuro se non commentata a causa di nessun riferimento esistente. –

18

può essere problema versione se si utilizza la primavera 4.X poi

a.) Login url =/login b.) Esci url =/logout

dove, come nel caso in cui primavera 3.X

a.) login url =/j_spring_security_check b.) Esci url =/j_spring_security_logout

3

Ho anche affrontato questo problema quando disabilitare csrf. Ho provato a specificare lo loginProcessingUrl in modo esplicito e ha funzionato perfettamente!

@Override 
protected void configure(HttpSecurity httpSecurity) throws Exception { 
    httpSecurity.csrf().disable(); 
    httpSecurity.formLogin().loginProcessingUrl("/login-url"); 
} 

Si prega di notare che:

  1. Questo URL consente solo HTTP POST metodo.
  2. Altri predefiniti URL importanti in Spring Security sono: 1. /login: inviare il modulo di login di default 2. /logout

La mia versione è Spring Security 4.0.3.RELEASE

P/S: la mia risposta non può essere correlato direttamente alla domanda, ma penso che possa aiutare qualcuno che è nuovo a Spring Security come me

Problemi correlati