是否可以为 Spring Boot 应用程序提供 oauth 和基本用户名密码登录选项?

Posted

技术标签:

【中文标题】是否可以为 Spring Boot 应用程序提供 oauth 和基本用户名密码登录选项?【英文标题】:Is it possible to provide both oauth & basic username password log in option to a spring boot application? 【发布时间】:2021-08-29 11:46:46 【问题描述】:

我正在尝试通过提供基于用户名和密码的登录以及用于用户身份验证的 google oAuth 来使用 Spring Boot 实现基本登录页面。

想知道 spring 是否允许使用相同的应用程序来完成此操作。

任何帮助将不胜感激。

【问题讨论】:

你总是可以有两个过滤器并基于这些建立身份验证 【参考方案1】:

是的,可以做到。您需要同时配置 OAuth2 和表单登录 您的 WebSecurityConfigurer 并配置自定义登录页面。您还需要配置一个 PasswordEncoder 和 UserDetailsService 对于表单登录和 OAuth2UserService (可能还有一个 OidcUserService) 用于 OAuth2 登录。这 Principal 实现将对应于登录的类型。

WebSecurityConfigurer.configure(HttpSecurity):

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http.antMatcher("/**")
                .authorizeRequests(t -> t.anyRequest().authenticated())
                .formLogin(t -> t.loginPage("/login").permitAll())
                .oauth2Login(Customizer.withDefaults())
                .logout(t -> t.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                              .logoutSuccessUrl("/").permitAll());
            ...
        

自定义登录页面,包括表单登录和 OAuth2 提供者链接:

<div>
  <div>
    <div>
      <form th:object="$form">
        <input type="email" th:name="username" th:placeholder="'E\'mail Address'"/>
        <label th:text="'E\'mail Address'"/>
        <input type="password" th:name="password" th:placeholder="'Password'"/>
        <label th:text="'Password'"/>
        <button type="submit" th:text="'Login'"/>
        <th:block th:if="$! oauth2.isEmpty()">
          <hr/>
          <a th:each="client : $oauth2" th:href="@/oauth2/authorization/id(id=$client.registrationId)" th:text="$client.clientName"/>
        </th:block>
      </form>
    </div>
  </div>
  <div>
    <div>
      <p th:if="$param.error">Invalid username and password.</p>
      <p th:if="$param.logout">You have been logged out.</p>
    </div>
  </div>
</div>

OAuth2 配置:

---
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: XXXXXXXXXXXXXXXXXXXX
            client-secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        provider:
          google:
            user-name-attribute: email

这来自我的文章 https://blog.hcf.dev/article/2020-10-31-spring-boot-part-07(源代码 在 https://github.com/allen-ball/spring-boot-web-server/tree/trunk/part-07)。

【讨论】:

以上是关于是否可以为 Spring Boot 应用程序提供 oauth 和基本用户名密码登录选项?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot介绍

spring boot介绍

Spring Boot入门

Spring Boot快速入门

Spring-Boot之Security安全管理-10

Spring boot- Spring Boot特性1