spring-boot - 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 篇教程之后,我发现它们之间有很多不一致之处,以至于我真的迷路了。
解决方案
您似乎对 csrf 参数使用了不正确的小胡子语法。您需要{{
渲染上下文变量。
<input type="hidden" name="{{_csrf.parameterName}}" value="{{_csrf.token}}"/>
此外,您需要通过将此设置添加到您来将“_csrf”对象复制到 MVC 模型application.properties
。
spring.mustache.expose-request-attributes=true
最后,您可能会看到一个,IllegalArgumentException
因为您没有指定密码编码器。如果发生这种情况,您将在堆栈跟踪中看到错误。可以通过指定一个来修复它PasswordEncoder
。
推荐阅读
- javascript - 用括号和省略号在流中键入别名
- javascript - 更改事件侦听器中的 setAttribute 不更新视图
- flutter - Flutter:BorderRadius 在 showGeneralDialog 下不起作用
- android - 匕首 2 组件中的匕首 2 模块
- node.js - how to get the count of documents with value in different fields in mongo
- php - Woocommerce 需要很长时间才能加载并抛出我的页面并出现 503 错误
- python - 如何使用 Discord.py 获取发件人 ID?
- arrays - 空手道:在一种情况下验证 json 和数组的键时遇到问题
- c++ - 如何按键对 std::list 进行排序?
- amazon-web-services - 如何在我的 Jenkins 作业中使用存储在 AWS Secrets Manager 中的用户名和密码?