我在一个Sping 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。我该如何让它工作呢?
1条答案
按热度按时间nnsrf1az1#
设置
failureHandler
会覆盖默认的/login?error
(并自动配置此URL以不需要身份验证)。