最新 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 配置
- 登录到 GitHub Developer Settings。
- 创建一个新的 OAuth 应用,填写应用名称、主页 URL、回调 URL(通常是
http://localhost:8080/login/oauth2/code/github
)等信息。 - 获取
Client ID
和Client Secret
,用于后续配置。
2.2 Gitee 配置
- 登录到 Gitee Developer Settings.
- 在 “开发者设置” 中创建一个新的 OAuth 应用,填写相关信息。
- 获取
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 将会自动处理登录流程。你还可以根据需要自定义用户信息的获取和存储方式。
发表回复