Spring Security /找不到j_spring_security_check 404

时间:2014-12-14 13:32:09

标签: spring spring-mvc spring-security thymeleaf

这是我的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
    }

}

这是我的login.html(来自百里香的示例html):

<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

我如何摆脱这个错误?我google了很多,但还没有成功。 (是的,我不使用任何xml。)

3 个答案:

答案 0 :(得分:18)

如果您使用spring 4.X那么可能是版本问题

  

a。)login url = / login   b。)logout url = / logout

如弹簧3.X那样

  

a。)login url = / j_spring_security_check   b。)logout url = / j_spring_security_logout

答案 1 :(得分:9)

我创建了这个,现在可以使用了:

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

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

}

这会激活SpringSecurityFilterChain。

由于CSRF错误,我还必须从@EnableWebSecurity切换到 @EnableWebMvcSecurity 。正如在春季文档中写道:

  

......原因是Spring Security正在防范CSRF   attakcks并且我们的请求中没有包含CSRF令牌。更新我们的   配置使用@EnableWebMvcSecurity注释   与@EnableWebMvcSecurity一样并提供集成   Spring MVC。除此之外,它将确保我们的CSRF令牌   使用Thymleaf 2.1+或Spring时自动包含在我们的表单中   MVC taglibs ......

也感谢M. Deinum的评论。 Spring最近显然将/ j_spring_security_check / j_password / j_username切换为/ login / password / username。

答案 2 :(得分:3)

禁用csrf时我也遇到过这个问题。我尝试明确指定loginProcessingUrl,它完美无缺!

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

请注意:

  1. 此网址仅允许使用HTTP POST方法。
  2. Spring Security中的其他默认重要网址为:1。/login:返回默认登录表单2. /logout
  3. 我的Spring Security版本是4.0.3.RELEASE

    P/S:我的回答可能与此问题没有直接关系,但我认为它可以帮助像我这样Spring Security新手的人