Java Spring安全性-无法使用自定义登录页登录

Java Spring安全性-无法使用自定义登录页登录,java,html,spring,spring-security,Java,Html,Spring,Spring Security,我正在学习spring,目前正在学习使用spring Security的传统用户/密码身份验证 目前,如果我让Spring使用默认页面登录,我可以毫无问题地进行登录,但是如果我尝试为登录设置自定义页面,甚至键入正确的数据(我使用Inspect工具确认了这一点),我不会重定向到主页,而是重定向到相同的登录页面,而不是“localhost:1812/login”,页面将更改为“localhost:1812/login?error”,我无法登录。基本上,我的WebSecurity配置类是: @Conf

我正在学习spring,目前正在学习使用spring Security的传统用户/密码身份验证

目前,如果我让Spring使用默认页面登录,我可以毫无问题地进行登录,但是如果我尝试为登录设置自定义页面,甚至键入正确的数据(我使用Inspect工具确认了这一点),我不会重定向到主页,而是重定向到相同的登录页面,而不是“localhost:1812/login”,页面将更改为“localhost:1812/login?error”,我无法登录。基本上,我的WebSecurity配置类是:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        System.out.println("ccc");
        http
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        //.formLogin().permitAll()
        .formLogin().loginPage("/login").permitAll()
        .defaultSuccessUrl("/home", true);
    
        System.out.println("ddd");
    
    }
    
    @Bean
    @Override
    protected UserDetailsService userDetailsService() {  
        System.out.println("AAA");
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("root")
                .password("root")
                .roles("ADM")
                .build();
        System.out.println("bbb");
        return new InMemoryUserDetailsManager(user);
    }
}
如果我使用“.formLogin().permitAll()”而不是“.formLogin().loginPage(“/login”).permitAll()”),我可以成功登录,但Spring将加载标准登录页面。我想知道会出什么问题。在Inspect工具上,我在自定义页面上发送登录名时收到HTTP状态代码302,但我不知道这意味着什么。。。在这里,我留下了我的LoginController和login.html的代码,如果有人帮助我,我将非常感激,因为我努力了,但我无法解决这个问题

登录控制器

@Controller
public class LoginController {
    
    @GetMapping
    @RequestMapping("/login")
    public String login() {
        return "login";
    }
    
}
login.html

<!DOCTYPE html>
<html>
    <head th:replace="~{base :: head}"></head>
    <body>
        <div th:replace="~{base :: logo}"></div>
        <div class="container">
            <div th:replace="~{base :: titulo('Login')}"></div>
            <div class="card mb-3">
                <form th:action="@{/login}" method="POST" class="card-body">
                    <div class="form-group mb-3">
                        <div class="mb-2">
                            <label for="username" class="sr-only">Usuário</label>
                            <input type="text" name="username" class="form-control" placeholder="usuário"/>
                        </div>
                        <div class="mb-2">
                            <label for="password" class="sr-only">Senha</label>
                            <input type="password" name="username" class="form-control" placeholder="senha"/>
                        </div>
                        <button class="btn btn-primary" type="submit">Login</button>
                    </div>                  
                </form>
            </div>
        </div>
    </body>
</html>
但当我输入用户名和密码时,仍然无法登录,我被重定向到同一个登录页面,但url现在是“http://localhost:1812/login?message=error,类似于带有“.failureUrl(“/login?message=error”)”的代码行。这是否意味着我的问题在于html?老实说,我不知道

编辑2:使用源代码

要尝试查找我遇到的错误类型,我现在的登录方法是:

@GetMapping("/login-error")
    @RequestMapping("/login")
    public String login(HttpServletRequest request, Model model) {
        HttpSession session = request.getSession(false);
        String errorMessage = null;
        if (session != null) {
            AuthenticationException ex = (AuthenticationException) session
                    .getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
            if (ex != null) {
                errorMessage = ex.getMessage();
            }
        }
        System.out.println("--->" + errorMessage);
        model.addAttribute("errorMessage", errorMessage);
        return "login";
    }
同样,即使键入正确的凭据(如我在“userDetailsService”方法中指定的),我也无法登录,但这次我终于可以在控制台上看到错误消息:

--->User not found or invalid password

显然,我走了,但没有离开这个地方,因为现在我不知道我的代码有什么问题…

你需要添加一些这样的代码来配置表单中的用户名和密码,还需要使用loginProcessingUrl()–将用户名和密码提交到的URL

Spring登录触发身份验证过程的默认URL是/perform_Login,它在Spring security 4之前是/j_Spring_security_check

参考资料:


看起来这可能只是个打字错误。您的密码字段称为用户名:


将其更改为:



一切都很好。

谢谢你的帮助!但是当我使用你的代码来配置方法时,我幸运地发现了这个异常:“java.lang.IllegalStateException:至少需要一个映射(即authorizeRequests().anyRequest().authenticated())”,所以,我添加了错误提示的代码,我的Chrome浏览器说:“这个页面不工作。本地主机的重定向太多了”…天哪,天哪。我只是不想扔掉我的文凭,因为这种错误在我们编程时很常见,但当我意识到我花了一整天的时间试图解决一个变量名错误的问题时,我感到非常愚蠢。。。无论如何,我非常感谢你注意到这个错误:)非常欢迎!祝你下一步好运。
--->User not found or invalid password
@Override
protected void configure(HttpSecurity http) throws Exception {
    // Redirect to 403 page if user do not has role permission
    http.authorizeRequests().and().exceptionHandling().accessDeniedPage("/403");
    // Login & Logout cofig
    http.authorizeRequests().and().formLogin().loginPage("/login").loginProcessingUrl("/perform_login")
            .defaultSuccessUrl("/home").failureUrl("/login?message=error").usernameParameter("username")
            .passwordParameter("password").and().logout().logoutUrl("/perform_logout")
            .logoutSuccessUrl("/login?message=logout");
}