- 演示工具版本
- Maven 依赖项
- Spring Boot 2.x OAuth2 客户端属性配置
- 使用 Spring HttpSecurity.oauth2Login()
- 覆盖 OAuth2 自动配置功能
- 创建控制器和视图
- 输出结果
- 参考文献
- 源码下载
本页将介绍Spring Boot 2.x OAuth2登录示例。
SpringBoot2.x为OAuth2登录提供了完整的自动配置。
我们只需要在应用程序属性文件中为GitHub、Facebook和Google等OAuth2提供程序配置客户端ID和客户端密钥,就完成了。
Oauth2认证的过程如下:请求一个需要登录的网站A,会提示我们使用第三方网站B的用户登录,我们登录,这时候需要我们授权,就是authorize,授权之后,会得到一个token,我们拿到这个token就可以访问这个网站A了。A网站不关心B网站的用户信息。
我们可以通过重写WebSecurityConfigureAdapter的方法并使用Spring5.0中引入的HttpSecurity.oauth2Login()方法来定制配置。
我们需要为ClientRegistrationRepository创建一个bean来覆盖OAuth2属性值。
在本页中,我们将使用GitHub、Facebook和Google身份验证提供商为OAuth2登录创建一个Spring Boot安全(Security)应用程序。
演示工具版本- Java 11
- Spring 5.1.7.RELEASE
- Spring Boot 2.1.5.RELEASE
- Maven 3.5.2
pom.xml
Spring Boot 2.x OAuth2 客户端属性配置org.springframework.boot spring-boot-starter-parent 2.1.5.RELEASE spring-app 11 org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf org.springframework.security spring-security-oauth2-client 5.1.7.RELEASE org.springframework.security spring-security-oauth2-jose 5.1.7.RELEASE
要使用Spring Boot 2.x自动配置启用OAuth2登录,只需配置下面给出的最少两个属性就可以了。
spring.security.oauth2.client.registration.[registrationId].client-id
注册客户端id。
spring.security.oauth2.client.registration.[registrationId].client-secret
注册客户端密码。
注册ID是google、github、facebook等。要配置所有这些OAuth2提供者,请找到属性文件。
application.properties
spring.security.oauth2.client.registration.github.client-id= github-client-id spring.security.oauth2.client.registration.github.client-secret= github-client-secret spring.security.oauth2.client.registration.facebook.client-id= facebook-client-id spring.security.oauth2.client.registration.facebook.client-secret= facebook-client-secret spring.security.oauth2.client.registration.google.client-id= google-client-id spring.security.oauth2.client.registration.google.client-secret= google-client-secret
查找等效的YML文件。
application.yml
spring:
security:
oauth2:
client:
registration:
github:
client-id: github-client-id
client-secret: github-client-secret
facebook:
client-id: facebook-client-id
client-secret: facebook-client-secret
google:
client-id: google-client-id
client-secret: google-client-secret
使用 Spring HttpSecurity.oauth2Login()
HttpSecurity.oauth2Login()方法已在Spring 5.0中引入。
oauth2Login()方法使用OAuth 2.0或OpenID Connect 1.0 Provider配置认证支持。
默认配置会在/login上自动生成一个登录页面。找到使用oauth2Login()方法的代码。
SecurityConfig.java
package com.concretepage;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/", "/login**", "/error**").permitAll()
.anyRequest().authenticated()
.and().logout().logoutUrl("/logout").logoutSuccessUrl("/")
.and().oauth2Login();
}
}
覆盖 OAuth2 自动配置功能
为了覆盖OAuth2登录的Spring boot自动配置,我们需要为ClientRegistrationRepository创建一个bean,该bean通过传递ClientRegistration实例列表进行实例化。
ClientRegistration表示客户端向OAuth 2.0或OpenID Connect 1.0提供程序注册。
查找使用GitHub和Google覆盖OAuth2登录的自动配置的示例代码。
SecurityConfig.java
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/", "/login**", "/error**").permitAll()
.anyRequest().authenticated()
.and().logout().logoutUrl("/logout").logoutSuccessUrl("/")
.and().oauth2Login();
}
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {
List registrations = new ArrayList<>();
registrations.add(githubClientRegistration());
registrations.add(googleClientRegistration());
return new InMemoryClientRegistrationRepository(registrations);
}
private ClientRegistration githubClientRegistration() {
return ClientRegistration.withRegistrationId("github")
.clientId("github-client-id")
.clientSecret("github-client-secret")
.clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}")
.authorizationUri("https://github.com/login/oauth/authorize")
.tokenUri("https://github.com/login/oauth/access_token")
.userInfoUri("https://api.github.com/user")
.clientName("GitHub").build();
}
private ClientRegistration googleClientRegistration() {
return ClientRegistration.withRegistrationId("google")
.clientId("google-client-id")
.clientSecret("google-client-secret")
.clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}")
.scope("openid", "profile", "email", "address", "phone")
.authorizationUri("https://accounts.google.com/o/oauth2/v2/auth")
.tokenUri("https://www.googleapis.com/oauth2/v4/token")
.userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo")
.userNameAttributeName(IdTokenClaimNames.SUB)
.jwkSetUri("https://www.googleapis.com/oauth2/v3/certs")
.clientName("Google").build();
}
}
创建控制器和视图
AppController.java
package com.concretepage;
import java.security.Principal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class AppController {
@GetMapping("hello")
public ModelAndView welcome(Principal principal) {
ModelAndView mav = new ModelAndView();
mav.setViewName("welcome");
mav.addObject("name", principal.getName());
return mav;
}
}
index.html
Spring Security Go to Dashboard Login with GitHub
Login with Facebook
Login with Google
welcome.html
Welcome
Welcome [[${name}]]
error.html
Spring Security An error occurred.
Main.java
package com.concretepage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
输出结果
下载项目并在application.properties文件中输入google、github、facebook的client-id和client-secret。
然后用命令提示符从项目的根文件夹运行以下命令。
mvn spring-boot:run
访问网址。
http://localhost:8080/
浏览器展示页面
【1】OAuth 2.0 Login
【2】Spring Doc: HttpSecurity
【3】Spring Boot OAuth2 Login Example
提取码:mao4
spring-boot-oauth2-login.zip



