2014-12-14 15 views
7

Hier ist meine WebAppInitializer:Spring Security/j_spring_security_check nicht gefunden 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[] { "/" }; 
    } 
} 

Hier ist meine Security Config:

@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 
    } 

} 

Und das ist mein login.html (Beispiel html von 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> 

Wenn ich bei der Anmeldung klicken, diese Fehler angezeigt:

HTTP ERROR 404 

Problem accessing /j_spring_security_check. Reason: 

    Not Found 

Wie kann ich diesen Fehler loswerden? Ich habe viel gegoogelt, aber noch keinen Erfolg. (Ja ich benutze keine xml.)

Antwort

9

ich diese erstellt haben, und es funktioniert jetzt:

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

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 

} 

Diese apperently die SpringSecurityFilterChain aktiviert.

Ich musste auch von @EnableWebSecurity zu @EnableWebMvcSecurity wegen eines CSRF-Fehlers wechseln. Wie im Frühjahr doc geschrieben:

... Der Grund dafür ist, dass Spring Security gegen CSRF schützt attakcks und es gibt keine CSRF-Token in unserer Anfrage enthalten. Aktualisieren Sie unsere Konfiguration, um die Annotation @EnableWebMvcSecurity zu verwenden, die dasselbe wie @EnableWebMvcSecurity vornimmt und eine Integration mit Spring MVC bereitstellt. Unter anderem wird es unsere CSRF-Token gewährleisten in unsere Formulare enthalten automatisch, wenn Thymleaf 2.1+ oder Frühling MVC Taglibs mit ...

Auch Dank M. Deinum für seinen Kommentar. Spring hat kürzlich den/j_spring_security_check/j_password/j_username anscheinend auf/login/password/username umgestellt.

+0

Alternative zu den oben genannten ist, den Filter programmgesteuert zu initialisieren. IE: FilterRegistration.Dynamic springSecurityFilterChain = container.addFilter ("springSecurityFilterChain", DelegatingFilterProxy.class); springSecurityFilterChain.addMappingForUrlPatterns (null, false, "/ *"); Für mich ist dieser Ansatz sinnvoller oder Sie könnten ihn Ihrer XML-Anwendung hinzufügen. Das Gleiche, eine leere Klasse zu haben, scheint einfach falsch zu sein und wird wahrscheinlich in der Zukunft gelöscht werden, wenn sie nicht kommentiert wird, weil keine Referenzen existieren. –

18

Kann Version Problem sein, wenn Sie Feder verwendet werden 4.X dann

a.) Login url =/login b.) Logout url =/Logout

wo wie im Fall 3.X Frühling

a.) Login url =/j_spring_security_check b.) Abmelde url =/j_spring_security_logout

3

Ich habe auch dieses Problem beim Deaktivieren von CSRF konfrontiert. Ich habe versucht, die loginProcessingUrl explizit anzugeben und es hat perfekt funktioniert!

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

Bitte beachten Sie, dass:

  1. Diese URL nur HTTP POST Methode ermöglicht.
  2. Andere Standard wichtig Urls in Spring Security sind: 1. /login: 2. /logout

Meine Spring Security Version ist 4.0.3.RELEASE

P/S das Standard-Login-Formular zurück: meine Antwort nicht in Zusammenhang stehen kann direkt auf die Frage, aber ich denke, es kann jemand helfen, der neu ist Spring Security wie ich