OAuth2(Open Authorization 2.0)是一种开放的授权标准,它允许用户(资源所有者)授权第三方应用访问他们存储在另一个服务提供商上的资源,而无需将用户名和密码提供给第三方应用。这极大地增强了用户数据的安全性,同时也为第三方应用提供了一种安全、便捷的方式来访问用户资源。
OAuth2 的主要应用场景包括社交登录(如使用微信、QQ、Google 等账号登录第三方应用)、API 访问授权等。
OAuth2 定义了四种授权流程:授权码模式、简化模式、密码模式和客户端凭证模式。其中,授权码模式是最常用且最安全的模式,下面将重点介绍该模式。
可以使用 Spring Initializr(https://start.spring.io/)创建一个包含 Spring Web、Spring Security 和 Spring Security OAuth2 Client 的项目。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, ClientRegistrationRepository clientRegistrationRepository) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login();
return http.build();
}
}
spring.security.oauth2.client.registration.google.client-id=your-google-client-id
spring.security.oauth2.client.registration.google.client-secret=your-google-client-secret
spring.security.oauth2.client.registration.google.scope=openid,profile,email
spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth
spring.security.oauth2.client.provider.google.token-uri=https://www.googleapis.com/oauth2/v4/token
spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
spring.security.oauth2.client.provider.google.user-name-attribute=sub
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/")
public String home() {
return "Welcome to the protected resource!";
}
}
启动 Spring Boot 项目,访问 http://localhost:8080
,会自动重定向到 Google 的授权页面,用户登录并授权后,会返回到项目的首页。
概念 | 描述 |
---|---|
资源所有者 | 拥有资源的用户 |
客户端 | 请求访问资源的第三方应用 |
授权服务器 | 验证用户身份并颁发授权凭证 |
资源服务器 | 存储用户资源并验证访问令牌 |
授权码模式 | 最常用且最安全的授权流程 |
OAuth2 作为一种开放授权标准,为用户和第三方应用提供了安全、便捷的资源访问方式。通过 Spring 集成 OAuth2,我们可以轻松实现社交登录、API 访问授权等功能。在实际应用中,需要根据具体需求选择合适的授权流程,并注意保护用户的隐私和数据安全。