最新 Spring Security 实战教程(十五)——快速集成 GitHub 与 Gitee 的社交登录

在现代 Web 应用中,社交登录越来越流行,因为它简化了用户注册和登录的过程,且提高了用户体验。通过集成社交平台的登录功能,用户可以通过 GitHub、Gitee 等平台的账号直接登录到你的应用。

本教程将教你如何使用 Spring Security 快速集成 GitHub 和 Gitee 的社交登录功能。我们将会通过 spring-security-oauth2-client 和 spring-security-oauth2-core 库来实现这一功能。

1. 添加依赖

首先,你需要在 pom.xml 中添加相关依赖。以下是需要的 Maven 依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Security Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <!-- OAuth2 Client Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>

    <!-- Spring Security OAuth2 -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-client</artifactId>
    </dependency>
</dependencies>

2. 配置 GitHub 和 Gitee 的 OAuth 应用

2.1 GitHub 配置

  1. 登录到 GitHub Developer Settings
  2. 创建一个新的 OAuth 应用,填写应用名称、主页 URL、回调 URL(通常是 http://localhost:8080/login/oauth2/code/github)等信息。
  3. 获取 Client ID 和 Client Secret,用于后续配置。

2.2 Gitee 配置

  1. 登录到 Gitee Developer Settings.
  2. 在 “开发者设置” 中创建一个新的 OAuth 应用,填写相关信息。
  3. 获取 Client ID 和 Client Secret

3. 配置 application.yml 或 application.properties

在你的 Spring Boot 项目的 application.yml 或 application.properties 文件中,配置 GitHub 和 Gitee 的 OAuth 客户端信息。

application.yml 示例:

spring:
  security:
    oauth2:
      client:
        registration:
          github:
            client-id: YOUR_GITHUB_CLIENT_ID
            client-secret: YOUR_GITHUB_CLIENT_SECRET
            scope: read:user
            redirect-uri: "{baseUrl}/login/oauth2/code/github"
            authorization-grant-type: authorization_code
            client-name: GitHub
        provider:
          github:
            authorization-uri: https://github.com/login/oauth/authorize
            token-uri: https://github.com/login/oauth/access_token
            user-info-uri: https://api.github.com/user

        # Gitee 配置
        registration:
          gitee:
            client-id: YOUR_GITEE_CLIENT_ID
            client-secret: YOUR_GITEE_CLIENT_SECRET
            scope: user_info
            redirect-uri: "{baseUrl}/login/oauth2/code/gitee"
            authorization-grant-type: authorization_code
            client-name: Gitee
        provider:
          gitee:
            authorization-uri: https://gitee.com/oauth/authorize
            token-uri: https://gitee.com/oauth/token
            user-info-uri: https://gitee.com/api/v5/user

在这个配置中:

  • client-id 和 client-secret 是你在 GitHub 和 Gitee 上申请的应用凭证。
  • authorization-uri 和 token-uri 是 OAuth2 协议中用于获取授权码和访问令牌的 URL。
  • user-info-uri 是用于获取用户信息的 API URL。
  • redirect-uri 是当用户授权后,OAuth2 授权服务器重定向回你的应用的 URL。

application.properties 示例:

spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_CLIENT_ID
spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_CLIENT_SECRET
spring.security.oauth2.client.registration.github.scope=read:user
spring.security.oauth2.client.registration.github.redirect-uri={baseUrl}/login/oauth2/code/github
spring.security.oauth2.client.registration.github.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.github.client-name=GitHub

spring.security.oauth2.client.provider.github.authorization-uri=https://github.com/login/oauth/authorize
spring.security.oauth2.client.provider.github.token-uri=https://github.com/login/oauth/access_token
spring.security.oauth2.client.provider.github.user-info-uri=https://api.github.com/user

spring.security.oauth2.client.registration.gitee.client-id=YOUR_GITEE_CLIENT_ID
spring.security.oauth2.client.registration.gitee.client-secret=YOUR_GITEE_CLIENT_SECRET
spring.security.oauth2.client.registration.gitee.scope=user_info
spring.security.oauth2.client.registration.gitee.redirect-uri={baseUrl}/login/oauth2/code/gitee
spring.security.oauth2.client.registration.gitee.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.gitee.client-name=Gitee

spring.security.oauth2.client.provider.gitee.authorization-uri=https://gitee.com/oauth/authorize
spring.security.oauth2.client.provider.gitee.token-uri=https://gitee.com/oauth/token
spring.security.oauth2.client.provider.gitee.user-info-uri=https://gitee.com/api/v5/user

4. 启用 OAuth2 登录

在你的 Spring Boot 项目中,你不需要额外的配置来启用 OAuth2 登录,因为 spring-boot-starter-oauth2-client 会自动处理这一切。你只需要通过以下方式进行配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home", "/login", "/login/oauth2/**").permitAll()  // 允许公开访问的路径
                .anyRequest().authenticated()  // 其他路径需要身份验证
            .and()
            .oauth2Login()  // 启用 OAuth2 登录
            .defaultSuccessUrl("/home", true)  // 登录成功后跳转的 URL
            .failureUrl("/login?error=true");  // 登录失败后跳转的 URL
    }
}

5. 运行应用并测试

  • 启动你的 Spring Boot 应用。
  • 访问 http://localhost:8080/,你应该能看到一个登录按钮,点击后会出现 GitHub 和 Gitee 的登录选项。
  • 用户点击其中一个社交平台的登录按钮后,系统将会引导用户进行 OAuth 授权。
  • 授权成功后,Spring Security 会将用户信息从 GitHub 或 Gitee 获取并存储在 Principal 对象中。

你可以在 /home 路径中展示用户的信息,例如:

@Controller
public class HomeController {

    @GetMapping("/home")
    public String home(Model model, Principal principal) {
        model.addAttribute("user", principal.getName());
        return "home";
    }
}

在 home.html 中:

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <h1>Welcome, ${user}!</h1>
</body>
</html>

6. 自定义用户信息

你可以自定义 OAuth2UserService 来处理社交登录后获取的用户信息:

@Bean
public OAuth2UserService<OAuth2UserRequest, OAuth2User> oauth2UserService() {
    return new CustomOAuth2UserService();
}

CustomOAuth2UserService 类可以从 GitHub 或 Gitee 获取更多的用户信息,并将其转换为 UserDetails 对象。

总结

通过本教程,你已经学会了如何在 Spring Boot 项目中集成 GitHub 和 Gitee 的社交登录功能。只需要配置 OAuth2 客户端,Spring Security 将会自动处理登录流程。你还可以根据需要自定义用户信息的获取和存储方式。