首页 > 解决方案 > Spring Boot Spring Security 应用程序重新加载登录页面而不是成功或失败

问题描述

我尝试用我的自定义登录屏幕替换 spring 安全登录屏幕。虽然默认的工作完美,但我自己的似乎对发布表格没有反应。它只是重新加载登录屏幕。

登录。小胡子:

{{> partials/header}}
<body class="grey lighten-4">
<div class="container">
    <form action="/login" method="POST">
        <div class="md-form">
            <input type="text" name="username" id="loginField" class="form-control">
            <label for="loginField">Login</label>
        </div>
        <div class="md-form">
            <input type="password" name="password" id="passwordField" class="form-control">
            <label for="passwordField">Password</label>
        </div>
        <button class="btn red text-white float-right" type="submit">Log in</button>
        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
    </form>
</div>
</body>
{{> partials/footer}}

登录控制器.kt

import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.ui.Model
import org.springframework.ui.set

@Controller
class LoginController {

    @GetMapping("/login")
    fun loginPage(model: Model): String {
        return "login"
    }
/*
    @PostMapping("/login")
    fun loginForm() {
        print("post")
    }*/
}

发布表单时,它甚至不会触发当前注释部分中的断点。

安全配置.kt

import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
import org.springframework.security.core.userdetails.User
import org.springframework.security.provisioning.InMemoryUserDetailsManager

@Configuration
@EnableWebSecurity
class SecurityConfig : WebSecurityConfigurerAdapter() {

    override fun configure(http: HttpSecurity) {
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/test")
                .permitAll()
    }

    override fun configure(auth: AuthenticationManagerBuilder) {
        auth.userDetailsService(
                InMemoryUserDetailsManager(
                        User.withUsername("user").password("user").authorities(mutableListOf()).build()
                )
        )
    }
}

我怀疑我错过了正确接收和处理表单内容的一些关键部分。然而,在经历了关于这个问题的 10 篇教程之后,我发现它们之间有很多不一致之处,以至于我真的迷路了。

标签: spring-bootspring-mvckotlinspring-security

解决方案


您似乎对 csrf 参数使用了不正确的小胡子语法。您需要{{渲染上下文变量。

<input type="hidden" name="{{_csrf.parameterName}}" value="{{_csrf.token}}"/>

此外,您需要通过将此设置添加到您来将“_csrf”对象复制到 MVC 模型application.properties

spring.mustache.expose-request-attributes=true

最后,您可能会看到一个,IllegalArgumentException因为您没有指定密码编码器。如果发生这种情况,您将在堆栈跟踪中看到错误。可以通过指定一个来修复它PasswordEncoder


推荐阅读