2014-12-14 6 views
7

Вот мой WebAppInitializer:Spring Security/j_spring_security_check Не найдено 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[] { "/" }; 
    } 
} 

Вот мой 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 
    } 

} 

И это мой login.html (пример 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> 

Когда я нахожусь на имени пользователя, появляется эта ошибка:

HTTP ERROR 404 

Problem accessing /j_spring_security_check. Reason: 

    Not Found 

Как я могу избавиться от этой ошибки? Я много гугл, но пока ничего не добился. (Да, я не использую любой XML.)

ответ

9

Я создал это, и он работает сейчас:

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

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 

} 

Это активирует SpringSecurityFilterChain apperently.

Мне также пришлось переключиться с @EnableWebSecurity на @EnableWebMvcSecurity из-за ошибки CSRF. Как и в весеннем документе написано:

... Причина заключается в том, что Spring Security защищает от CSRF attakcks и нет никаких маркеров CS не включают в нашей просьбе. Обновите нашу конфигурацию , чтобы использовать аннотацию @EnableWebMvcSecurity, которая будет сделать то же, что и @EnableWebMvcSecurity, и обеспечить интеграцию с Spring MVC. Помимо всего прочего, это обеспечит наше CSRF токен включены в наши формы автоматически при использовании Thymleaf 2.1+ или Spring MVC ...

библиотеки тегов

также благодарит М. Deinum за его комментарий. Весна недавно переключила/j_spring_security_check/j_password/j_username на/login/password/username.

+0

Альтернатива вышесказанному заключается в том, чтобы программно инициализировать фильтр. IE: FilterRegistration.Dynamic springSecurityFilterChain = container.addFilter ("springSecurityFilterChain", DelegatingFilterProxy.class); springSecurityFilterChain.addMappingForUrlPatterns (null, false, "/ *"); Для меня этот подход имеет больше смысла или вы можете добавить его в свое приложение xml. То же самое, имея пустой класс, просто кажется неправильным и, вероятно, будет удалено в будущем, если не будет прокомментировано из-за отсутствия ссылок. –

18

Может быть версия проблема, если вы используете пружинный 4.X затем

а.) Войти URL =/Логин б.) Выхода из системы URL =/выход из системы

, где, как и в случае весна 3.X

а.) Войти URL =/j_spring_security_check б.) выхода из системы URL =/j_spring_security_logout

3

Я также столкнулся с этой проблемой при отключении csrf. Я попытался точно указать loginProcessingUrl, и он отлично работал!

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

Пожалуйста, обратите внимание, что:

  1. Этот URL позволяет только HTTP POST метод.
  2. Другие важные по умолчанию URLs в Spring Security: 1. /login: вернуть регистрационную форму по умолчанию 2. /logout

Моя Spring Security версия 4.0.3.RELEASE

P/S: мой ответ не может быть связано прямо на вопрос, но я думаю, это может помочь кому-то, кто новичок в Spring Security, как и мне

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