我尝试用我的自定义屏幕替换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个有关此问题的教程之后,我发现它们之间有太多不一致之处,以至于我真的迷失了。
答案 0 :(得分:0)
似乎您对csrf参数使用的胡须语法不正确。
您需要{{
来呈现上下文变量。
<input type="hidden" name="{{_csrf.parameterName}}" value="{{_csrf.token}}"/>
此外,您还需要通过将此设置添加到application.properties
中来将“ _csrf”对象复制到MVC模型。
spring.mustache.expose-request-attributes=true
最后,由于您未指定密码编码器,因此可能会看到IllegalArgumentException
。如果发生这种情况,您将在堆栈跟踪中看到错误。可以通过指定PasswordEncoder
来解决。