Spring Security / J весенняя проверка безопасности не найдена 404
вот мой WebAppInitializer:
@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[] { "/" };
}
}
вот моя конфигурация безопасности:
@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
}
}
и это мой логин.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.)
3 ответов
может быть проблемой версии, если вы используете spring 4.X, то
a.) url-адрес входа = / login b) url выхода из системы = / logout
где, как в случае пружины 3.X
a.) url входа = / j_spring_security_check b) url выхода = / j_spring_security_logout
Я создал это, и теперь он работает:
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
}
это активирует SpringSecurityFilterChain видимо.
мне также пришлось переключиться с @EnableWebSecurity на @EnableWebMvcSecurity из-за ошибки CSRF. Как весной написано doc:
...Причина в том, что Spring Security защищает от CSRF attakcks и нет токена CSRF, включенного в наш запрос. Обновить наш конфигурация для использования @ Enablewebmvcsecurity аннотация, которая будет делать так же, как @EnableWebMvcSecurity и обеспечивают интеграцию с Весна в MVC. Среди прочего, это обеспечит наш токен CSRF включено в наши формы автоматически при использовании Thymleaf 2.1+ или Spring Taglibs в MVC...
также Спасибо М. Deinum за его комментарий. Весна недавно переключила /j_spring_security_check /j_password /j_username на /login /password / username по-видимому.
Я также столкнулся с этой проблемой при отключении csrf. Я попытался указать loginProcessingUrl
явно, и это сработало отлично!
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf().disable();
httpSecurity.formLogin().loginProcessingUrl("/login-url");
}
Пожалуйста, обратите внимание, что:
- этот url позволяет только
HTTP POST
метод. - другие важные URL-адреса по умолчанию в
Spring Security
are: 1./login
: возврат формы входа по умолчанию 2./logout
мой Spring Security
версия 4.0.3.Отпустите
P/S
: мой ответ не может быть связан непосредственно с вопрос, но я думаю, что это может помочь кому-то, кто новичок в Spring Security
как я