如何在 Spring Webflux 中自定义 Oauth2 的登录页面?

Posted

技术标签:

【中文标题】如何在 Spring Webflux 中自定义 Oauth2 的登录页面?【英文标题】:How Can I Customize Login Page for Oauth2 in Spring Webflux? 【发布时间】:2021-02-26 05:13:25 【问题描述】:

我只想覆盖默认的 oauth2 登录网址 (/login)。我怎样才能做到这一点?我尝试过的配置没有成功:

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) 
        http
                .authorizeExchange().pathMatchers(permittedUrls).permitAll()
                .anyExchange().authenticated()
                .and()
                .oauth2Login(Customizer.withDefaults()).formLogin().loginPage("/oauth2_login")
                .authenticationSuccessHandler(this::onAuthenticationSuccess)
                .and()
                .csrf().disable();
        return http.build();

我希望它会重定向到/oauth2_login url,但它没有用。它仍然重定向到 /login。但这次它返回 404 而不是显示默认登录页面。

【问题讨论】:

【参考方案1】:

上面的代码正在为formLogin 定制登录页面,这通常是基于用户名/密码的表单登录。使用新的 lambda 样式方法更容易查看您正在影响的配置,因此我更新了整个配置以使用它。如果要为 oauth2Login 自定义登录页面,则应更改其上的登录页面。例如:

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) 
    http
            .authorizeExchange(exchanges -> exchanges
                .pathMatchers(permittedUrls).permitAll()
                .anyExchange().authenticated()
            )
            .oauth2Login(oauth2 -> oauth2
                // you now must render a log in page for the URL /login
                .loginPage("/login") 
            );
            // remove formLogin that was for a username/password based log in
            // if you are doing oauth2 login I'm guessing you allow users to work within a browser, so you should not disable csrf
    return http.build();

【讨论】:

感谢您的回答,但未编译。 (无法解析“OAuth2LoginSpec”中的方法“loginPage”)

以上是关于如何在 Spring Webflux 中自定义 Oauth2 的登录页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring WebFlux 上自定义未经授权的响应

如何在 Spring Boot 和 Spring WebFlux 中使用“功能 bean 定义 Kotlin DSL”?

如何在 Spring Boot 1.4 中自定义 Jackson

如何在grails中自定义spring security插件登录页面

如何在 Spring Security 中自定义“错误凭据”错误响应?

6.1 如何在spring中自定义xml标签