首页 > 解决方案 > Spring身份验证登录失败不会转发到控制器

问题描述

我使用 spring security 来处理登录和登录错误。我已经设置了登录失败的 URL。但是,当我给它一个错误的凭据时,控制器似乎没有处理该请求。我尝试在处理失败者身份验证的控制器方法上设置断点,但它根本不会跳转到该方法。我没有登录名?错误 html。我只有一个 login.html 有谁知道为什么?

这是我的配置文件。

 @Override
public void configure(HttpSecurity http) throws Exception
{
    http.authorizeRequests()
            .antMatchers("/profile").hasRole("USER")
            .antMatchers("/resources/**","/", "/home", "/signUp").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
                    .loginPage("/login")
                    .defaultSuccessUrl("/homeSignedIn")
                    .failureUrl("/login?error")
                    .permitAll()
            .and()
            .rememberMe().tokenValiditySeconds(3600).key("mykey")
            .and()
            .logout()
            .logoutUrl("/signOut")
            .logoutSuccessUrl("/")
                .permitAll();
}

这是我的控制器。

@GetMapping("/login")
public String loginPage(Model model){
    Login login = new Login();
    model.addAttribute("login", login);
        return "login";
}

@GetMapping("/homeSignedIn")
public String loggedInPage(){
    return "homeSignedIn";
}


@GetMapping("/signOut")
public String signOutPage(){
    return "signOut";
}

@RequestMapping("/login?error")
public String loginError(Model model){
    model.addAttribute("loginError", true);
    return "login";
}

}

这是我的 login.html。

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>

    <title>Login Page</title>
</head>
<body>
<p th:if="${loginError}" > Wrong Username or password </p>
<form th:action="@{/login}" th:object="${login}" class="form-horizontal" method="post">
    <p align="middle">username: <input type="text" th:field="*{username}"></p>
    <p align="middle">password: <input type="password" th:field="*{password}"></p>
    <p align="middle"><input type="submit" value="Login"></p>
</form>
</body>
</html>

标签: spring-bootspring-mvcspring-security

解决方案


删除这个

@RequestMapping("/login?error")
public String loginError(Model model){
    model.addAttribute("loginError", true);
    return "login";
}

修改这个

@GetMapping("/login")
public String loginPage(Model model, @RequestParam(value = "error", required = false) Boolean error){
    if (error == null) {
        Login login = new Login();
        model.addAttribute("login", login);
    } else {
        model.addAttribute("loginError", true);
    }
    return "login";
}

并将配置更改为以下

.failureUrl("/login?error=true")

推荐阅读