2014-12-14 8 views
7

Oto moja WebAppInitializer:Wiosna zabezpieczeń/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[] { "/" }; 
    } 
} 

Oto moje bezpieczeństwo 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 
    } 

} 

A to moja login.html (przykład HTML 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> 

Po kliknięciu przycisku logowania pojawia się następujący komunikat:

HTTP ERROR 404 

Problem accessing /j_spring_security_check. Reason: 

    Not Found 

Jak mogę się pozbyć tego błędu? Dużo googlowałem, ale bez powodzenia. (Tak Nie używam żadnych xml).

Odpowiedz

9

Stworzyłem ten i działa teraz:

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

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 

} 

To aktywuje SpringSecurityFilterChain apperently.

Musiałem również przełączyć się z @EnableWebSecurity na @EnableWebMvcSecurity z powodu błędu CSRF. Podobnie jak w dok wiosennej jest napisane:

... Powodem jest to, że wiosna Security chroni przed CSRF attakcks i nie ma tokena CSRF to w naszą prośbę. Zaktualizuj naszą konfigurację , aby użyć adnotacji @EnableWebMvcSecurity, która będzie oznaczać to samo co @EnableWebMvcSecurity i zapewni integrację ze sprężyną MVC . Między innymi będzie to zapewnić naszym CSRF Reklamowe jest zawarte w naszych formularzy automatycznie podczas korzystania Thymleaf 2.1+ lub wiosną taglibs MVC ...

także dzięki M. Deinum dla jego komentarzem. Wiosna ostatnio zmieniła/j_spring_security_check/j_password/j_username na/login/password/username.

+0

Alternatywą dla powyższego jest zainicjowanie filtra programowo. IE: FilterRegistration.Dynamic springSecurityFilterChain = container.addFilter ("springSecurityFilterChain", DelegatingFilterProxy.class); springSecurityFilterChain.addMappingForUrlPatterns (null, false, "/ *"); Dla mnie to podejście ma więcej sensu lub można go dodać do swojego xml aplikacji. Czy to samo, posiadanie pustej klasy wydaje się po prostu błędne i prawdopodobnie zostanie usunięte w przyszłości, jeśli nie zostanie skomentowane z powodu braku referencji. –

18

Może być wersja problem, jeśli używasz sprężyny 4.X następnie

a.) Logowanie url =/login b.) Wylogowania url =/wylogowania

gdzie podobnie jak w przypadku sprężyna 3.X

a.) Adres logowania =/j_spring_security_check b). wylogowania URL =/j_spring_security_logout

3

Ten problem wystąpił również przy wyłączaniu csrf. Próbowałem wyraźnie określić loginProcessingUrl i działało idealnie!

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

Proszę zauważyć, że:

  1. Ten url pozwala tylko HTTP POST metody.
  2. Inne ważne domyślne adresy URL w Spring Security są: 1. /login: przywrócić domyślny formularz logowania 2. /logout

Moja Spring Security wersja jest 4.0.3.RELEASE

P/S: moja odpowiedź nie może być powiązany bezpośrednio na pytanie, ale myślę, że może pomóc komuś, kto jest nowy dla Spring Security jak ja