spring-security Vaadin LoginForm失败处理程序中断登录?错误URL

4dc9hkyq  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(139)

我在一个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。我该如何让它工作呢?

nnsrf1az

nnsrf1az1#

设置failureHandler会覆盖默认的/login?error(并自动配置此URL以不需要身份验证)。

相关问题