目前,我的配置很简单:
TrapHouseVersion
如果身份验证失败,我有两个要求:
将Flash错误消息发送到会话中(避免查询字符串中的“错误”参数)。看来我无法将// Kotlin code
override fun configure(http: HttpSecurity) {
http
.formLogin()
.loginPage("/entry")
.loginProcessingUrl("/auth")
.usernameParameter("usr")
.passwordParameter("pwd")
.defaultSuccessUrl("/", true)
.failureHandler { request, response, exception ->
// Can't figure out what to enter here (see below).
}
}
注入此lambda中;有解决方法吗?
我想发回用户在提交登录表单之前输入的登录名(而不是密码),以便重新填充该字段。我该怎么办?
答案 0 :(得分:1)
我能够弄清楚。
@Configuration
@EnableWebSecurity
class SecurityConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.formLogin()
.loginPage("/entry")
.loginProcessingUrl("/auth")
.usernameParameter("usr")
.passwordParameter("pwd")
.defaultSuccessUrl("/", true)
.failureHandler { request, response, _ ->
request.session.setAttribute("loginError", "Login Error!")
request.session.setAttribute("failedUsername", request.getParameter("usr"))
response.sendRedirect("/entry")
}
}
}
然后,您必须设置登录控制器以自定义登录表单的服务:
@Controller
@RequestMapping("/entry")
internal class LoginController {
@GetMapping
fun getLoginForm(session: HttpSession, model: Model): String {
if (session.getAttribute("loginError") != null) {
model.addAttribute("loginError", "Login Error!")
session.removeAttribute("loginError")
model.addAttribute("failedUsername", session.getAttribute("failedUsername"))
session.removeAttribute("failedUsername")
}
return "login"
}
}
然后,您可以在模板中使用loginError
和failedUsername
模型属性:
<div th:if="${loginError}">Incorrect login/password</div>
<!-- ... -->
<input type="text" name="usr" th:value="${failedUsername}">
基本上,我们正在将“闪烁”消息模拟为会话。我们在会话中携带这些消息,并在将其读取并传递到模型后立即将其删除。重定向可能会出错,并且消息将保留在会话中,但是它们本身无害,并且下次用户访问/entry
页面时也会将其删除。
结果,现在页面URL中没有?error
,并且不需要用户重新输入用户名。