我在Spring Boot项目中使用带有Spring Security的Vaadin LoginForm。默认情况下,如果身份验证因任何原因失败,它将重定向到/login?error
。我想对某些失败进行重定向,特别是如果用户还没有验证他们的电子邮件。我试图使用failureHandler
功能来做到这一点,但是一旦我创建一个,/login?error
URL突然要求用户进行身份验证,而/login
功能正常。
我的登录视图:
@PageTitle("Login")
@Route("login", layout = MainLayout::class)
class LoginView : VerticalLayout(), BeforeEnterObserver {
private val loginForm: LoginForm
init {
alignItems = FlexComponent.Alignment.CENTER
className = "login-view"
width = LumoUtility.Width.AUTO
loginForm = loginForm { action = "login" }
button("Register") {
onLeftClick { ui.ifPresent { it.navigate("register")} }
}
}
override fun beforeEnter(beforeEnterEvent: BeforeEnterEvent) {
if (beforeEnterEvent.location.queryParameters.parameters.containsKey("error")) {
loginForm.isError = true
}
}
}
我的安全配置:
@Configuration
@EnableWebSecurity
class SecurityConfiguration : VaadinWebSecurityConfigurerAdapter() {
@Throws(Exception::class)
override fun configure(http: HttpSecurity) {
http.formLogin()
.failureHandler(object : SimpleUrlAuthenticationFailureHandler() {
override fun onAuthenticationFailure(
request: HttpServletRequest?,
response: HttpServletResponse?,
exception: AuthenticationException?
) {
super.onAuthenticationFailure(request, response, exception)
}
})
super.configure(http)
setLoginView(http, LoginView::class.java)
}
正如您所看到的,我所做的只是在我的安全配置函数中添加了一个failureHandler,它只是调用默认的failureHandler,但这足以破坏/login?error
。如果我删除那个failureHandler,那么它就会像预期的那样工作,并在登录失败时显示/login?error
URL。我怎么让它工作?
设置failureHandler
覆盖了简单重定向到/login?error
的默认值(并自动将此URL配置为不需要身份验证)。查看代码,您只能有一个AuthenticationFailureHandler
。