【Spring Boot】Spring Boot 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
Maven 依赖项
pom.xml
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 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-secretspring.security.oauth2.client.registration.facebook.client-id= facebook-client-id
spring.security.oauth2.client.registration.facebook.client-secret= facebook-client-secretspring.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-idclient-secret: github-client-secretfacebook:client-id: facebook-client-idclient-secret: facebook-client-secretgoogle:client-id: google-client-idclient-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 {@Overrideprotected 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 {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/login**", "/error**").permitAll().anyRequest().authenticated().and().logout().logoutUrl("/logout").logoutSuccessUrl("/").and().oauth2Login();}@Beanpublic 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
标签:
相关文章
-
无相关信息
