Spring Boot Spring Security应用程序重新加载登录页面,而不是成功或失败

时间:2019-06-18 23:15:38

标签: spring-boot spring-mvc kotlin spring-security

我尝试用我的自定义屏幕替换spring安全登录屏幕。尽管默认设置可以完美地工作,但是我自己的默认设置似乎并没有反应。它只是重新加载登录屏幕。

login.mustache:

{{> 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}}

LoginController.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")
    }*/
}

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

SecurityConfig.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个有关此问题的教程之后,我发现它们之间有太多不一致之处,以至于我真的迷失了。

1 个答案:

答案 0 :(得分:0)

似乎您对csrf参数使用的胡须语法不正确。 您需要{{来呈现上下文变量。

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

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

spring.mustache.expose-request-attributes=true

最后,由于您未指定密码编码器,因此可能会看到IllegalArgumentException。如果发生这种情况,您将在堆栈跟踪中看到错误。可以通过指定PasswordEncoder来解决。